标签: dynamic-typing

C++在多大程度上是一种静态类型的语言?

我曾经认为这个问题的答案是" 100% ",但我最近指出了一个让它值得思考的例子.考虑声明为具有自动存储持续时间的对象的C数组:

int main()
{
    int foo[42] = { 0 };
}
Run Code Online (Sandbox Code Playgroud)

这里的类型foo很明显int[42].相反,请考虑以下情况:

int main()
{
    int* foo = new int[rand() % 42];
    delete[] foo;
}
Run Code Online (Sandbox Code Playgroud)

这里foo是is 的类型int*,但是如何在编译时告诉表达式创建new对象的类型?(重点是强调我不是在谈论new表达式返回的指针,而是关于表达式创建的数组对象new).

这就是C++ 11标准的第5.3.4/1段规定了new表达式的结果:

[...]由new-expression创建的实体具有动态存储持续时间(3.7.4).[注意:此类实体的生命周期不一定限于创建它的范围.-end note]如果实体是非数组对象,则new-expression返回指向所创建对象的指针.如果它是一个数组,则new-expression 返回一个指向数组初始元素的指针.

我以前认为在C++中所有对象的类型都是在编译时确定的,但上面的例子似乎反驳了这种信念.另外,根据第1.8/1段:

[...] 创建对象时确定对象的属性.对象可以有一个名称(第3条).对象的存储持续时间(3.7)会影响其生命周期(3.8).对象具有类型(3.9).[...]

所以我的问题是:

  1. 最后引用的段落中的" 属性 " 是什么意思?显然,对象的名称不能算作" 在创建对象时"确定的东西- 除非" 创建 "在这里意味着与我想的不同;
  2. 是否有其他类型仅在运行时确定类型的对象示例?
  3. 在多大程度上说C++是一种静态类型的语言是正确的?或者更确切地说,在这方面对C++进行分类的最恰当方式是什么?

如果有人能够至少详细说明上述一点,那就太好了.

编辑:

标准似乎清楚地表明new …

c++ static-typing dynamic-typing language-lawyer c++11

21
推荐指数
2
解决办法
2703
查看次数

如何动态定义“typing.Union”?

我在几个项目中使用Typeguard在 Python 运行时进行类型检查。它运作得很好。

我遇到过一种情况,函数参数的类型是typing.Union由一些动态收集的数据类型组成的。例如

def find_datatypes():
    # some stuff ...
    return (str, int) # dynamically generated list / tuple

datatypes = find_datatypes()
Run Code Online (Sandbox Code Playgroud)

现在我想生成一个typing.Unionfromdatatypes以便最终在函数中使用。我期望解包语法能够工作:

my_union = typing.Union[*datatypes]

@typeguard.typechecked
def some_function(param: my_union):
    pass
Run Code Online (Sandbox Code Playgroud)

然而,它并没有:

    my_union = typing.Union[*datatypes]
                            ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现我想要的目标?

python type-hinting dynamic-typing python-typing

20
推荐指数
2
解决办法
5033
查看次数

如何将多态函数应用于动态值

是否有一种理智的方法将多态函数应用于类型的值Dynamic

例如,我有一个类型的值,Dynamic我想应用于Just内部的值Dynamic.因此,如果值是由toDyn True我希望结果构建的toDyn (Just True).内部可能出现的不同类型的数量Dynamic不受限制.

(当涉及的类型来自封闭的宇宙时,我有一个解决方案,但这是令人不快的.)

haskell types dynamic-typing

19
推荐指数
1
解决办法
748
查看次数

虚拟机如何工作?

我一直在研究编程语言是如何工作的,其中一些有一个所谓的虚拟机.我知道这是在另一种编程语言中对编程语言进行仿真的某种形式,并且它的工作方式与使用堆栈执行编译语言的方式相同.我做对了吗?

根据我所做的附带条件,让我感到困惑的是,许多非编译语言允许使用"自由"类型系统的变量.以Python为例,我可以这样写:

x = "Hello world!"
x = 2**1000
Run Code Online (Sandbox Code Playgroud)

字符串和大整数是完全不相关的,并且在内存中占用不同的空间,那么这个代码如何在基于堆栈的环境中表示?这到底发生了什么?x是否指向堆栈中的新位置并且旧的字符串数据未被引用?这些语言不使用堆栈吗?如果没有,它们如何在内部表示变量?

stack dynamic-typing vm-implementation

18
推荐指数
1
解决办法
4946
查看次数

SQLite3的动态类型

与其他SQL版本相比,SQLite3使用动态类型而不是静态类型.在SQLite的网站上写着:

大多数SQL数据库引擎(除了SQLite之外的每个SQL数据库引擎,据我们所知)都使用静态,严格的类型.使用静态类型时,值的数据类型由其容器(存储值的特定列)确定.

SQLite使用更通用的动态类型系统.在SQLite中,值的数据类型与值本身相关联,而不是与其容器相关联.

在我看来,这正是你想要的,因为它允许你存储整数列中的字符串.

页面继续:

... SQLite中的动态类型允许它执行传统的刚性类型数据库中无法实现的操作.

我有两个问题:

  1. 用例问题:SQLite3的动态类型有哪些例子?
  2. 历史/设计问题:使用动态类型实现SQLite的动机是什么?

database sqlite dynamic-typing

18
推荐指数
2
解决办法
2271
查看次数

在 Julia 中要求类型声明

有什么方法可以在 Julia 中明确要求(例如在模块或包中)必须声明类型 ?例如或是否支持此类检查?更广泛地说,Julia 标准发行版本身是否提供任何可以帮助检查此要求的静态代码分析器或等效物? PackageCompilerLint.jl

作为一个激励示例,假设我们希望确保不断增长的生产代码库只接受始终声明类型的代码,前提是具有类型声明的大型代码库往往更易于维护。

如果我们想强制执行该条件,Julia 在其标准发行版中是否提供任何机制来要求类型声明或帮助推进该目标?(例如,任何可以通过短绒、提交钩子或等价物检查的东西?)

lint compilation static-typing dynamic-typing julia

18
推荐指数
2
解决办法
607
查看次数

什么时候sqlite的清单输入有用吗?

sqlite使用作者称之为" Manifest Typing "的东西,这基本上意味着sqlite是动态类型的:如果你愿意,你可以在一个"int"列中存储一个varchar值.

这是一个有趣的设计决定,但每当我使用sqlite时,我就像标准的RDMS一样使用它,并将类型视为静态.实际上,在其他系统中设计数据库时,我甚至从未希望使用动态类型列.

那么,这个功能何时有用?有没有人在实践中找到了一个很好用的东西,用静态类型的列不能轻易完成?

sql sqlite static-typing dynamic-typing

16
推荐指数
1
解决办法
1056
查看次数

你在哪里受益于动态打字?

您是否经常以一种在静态类型语言中真正不可行的方式利用动态类型?

我感兴趣的是,在现实世界(而不是演示)代码中使用它们的频率是多少?

dynamic-typing

13
推荐指数
2
解决办法
1748
查看次数

为什么Apple在类构造函数中对instancetype的使用不一致?

看一下NSArray.h中的NSArray创建方法块.

返回id的方法是否有正当理由不返回instancetype?

Apple甚至努力添加内联注释,让我们知道id在这种情况下会返回一个NSArray.

@interface NSArray (NSArrayCreation)

+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray *)array;

- (instancetype)init;   /* designated initializer */
- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt; /* designated   initializer */

- (instancetype)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray *)array;
- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag;

+ (id /* NSArray * */)arrayWithContentsOfFile:(NSString *)path;
+ (id /* NSArray * */)arrayWithContentsOfURL:(NSURL *)url;
- (id /* NSArray * */)initWithContentsOfFile:(NSString *)path;
- (id /* NSArray * */)initWithContentsOfURL:(NSURL *)url;

@end
Run Code Online (Sandbox Code Playgroud)

我能提出这些特殊方法的唯一方法就是Apple的这个指导 …

iphone objective-c dynamic-typing ios

13
推荐指数
2
解决办法
1273
查看次数

如何在Swift中为动态类型文本样式设置标题,子标题,正文,脚注和字幕字体?

我正在使用"使用文本工具包管理iOS应用程序中的文本"教程.它是为Objective C编写的,但我认为无论如何我都会尝试使用Swift.

但是,当我得到以下代码时,我无法弄清楚如何为UITextView使用Swift 设置标题和其他样式.这是Objective C代码:

- (IBAction)applyHeadlineStyle:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]];
}

- (IBAction)applySubHeadlineStyle:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]];
}

- (IBAction)applyBodyStyle:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]];
}

- (IBAction)applyFootnoteStyle:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]];
}

- (IBAction)applyCaption1Style:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]];
}

- (IBAction)applyCaption2Style:(id)sender {
    [_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]];
}
Run Code Online (Sandbox Code Playgroud)

我试过了

textView.setFont =
textView.preferredFontForTextStyle =
Run Code Online (Sandbox Code Playgroud)

然而,这些似乎都不起作用,而且我找不到任何Swift答案.

text-styling dynamic-typing ios textkit swift

13
推荐指数
1
解决办法
1万
查看次数