Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Objective-C对消息使用方括号?_Objective C_Syntax_Smalltalk - Fatal编程技术网

为什么Objective-C对消息使用方括号?

为什么Objective-C对消息使用方括号?,objective-c,syntax,smalltalk,Objective C,Syntax,Smalltalk,我正在读一本关于Smalltalk()的书。他以一个HomeBudget对象为例介绍了Smalltalk中消息的工作原理,并介绍了如何使用多个参数发送一条消息: HomeBudget spend: 229 on: 'VCR' Objective-C使用了Smalltalk的许多思想,例如消息对象和冒号作为参数,但总是将消息发送放在方括号中。同样的呼吁是: [homeBudget spend:229 on:@"VCR"]; 为什么Objective-C使用方括号(而不是像Smalltalk那样

我正在读一本关于Smalltalk()的书。他以一个
HomeBudget
对象为例介绍了Smalltalk中消息的工作原理,并介绍了如何使用多个参数发送一条消息:

HomeBudget spend: 229 on: 'VCR'
Objective-C使用了Smalltalk的许多思想,例如消息对象和冒号作为参数,但总是将消息发送放在方括号中。同样的呼吁是:

[homeBudget spend:229 on:@"VCR"];

为什么Objective-C使用方括号(而不是像Smalltalk那样将消息赤裸裸地留下)?因为它是基于C语言的,所以它是必需的语法吗?这是一种文体选择吗?它是否为您提供了更多的表达选择?还有其他原因吗?

Objective-C是“C”的一个严格超集,因此所有的添加都不需要改变“C”语言。所有“C”类课程也是有效的Objective-C课程

C++ +Otho对C语言进行了修改,使得所有的“C”程序都不能用C++编译器编译,也不是有效的C++程序。 因此,有必要找到“C”中未使用的符号,或者至少在冲突的上下文中未使用的符号。因此,在Objective-C中大量使用“@”。在其他情况下,添加符号以消除“C”的歧义。我发现这似乎暗示方括号用于语法:

DD:方括号是Objective-C语法的独特部分。方括号是怎么产生的,这是你做的吗

卑诗省:是的,就是我。从字面上说,这是在寻找一些没有被带走的东西。戴上了花括号。采用普通括号。这只是为了寻找不会与C语言使用的东西发生冲突的大括号

Tom Love也将自己归功于编程大师中的方括号,但他似乎在说这是一种风格选择:

我经常把自己称为负责Objective-C中方括号的人,因为布拉德和我就这个问题进行了长时间的交谈。我们的C语法是一致的C,还是我们创建了一种混合语言,我把它描述为“方括号是向对象领域的换档”?我们的观点是,如果你有一个混合语言,你可以建立一组基础类,以便在某个时候,大部分的工作实际上是在方括号内完成的。这允许对典型的应用程序程序员隐藏很多细节

方括号表示在Objective-C中发送的消息。最初的想法是,一旦您建立了一组类库,那么您将花费大部分时间在方括号内实际操作,因此,您实际上是在使用混合语言开发的底层对象框架进行面向对象编程,混合语言是过程语言和面向对象语言的组合。然后,当您开始构建功能库时,进入过程世界的需求越来越少,您可以呆在方括号内。设计一种基本上有两个层次的语言是一个深思熟虑的决定——一旦你建立了足够的能力,你就可以在更高的层次上操作。我真的认为这是原因之一。如果我们选择了一种非常类似C的语法,我不确定是否有人会知道这种语言的名称,它也不可能在任何地方仍然使用


从解析的角度来看,我怀疑这与在C的语法中友好地使用有关。@mah,事实上,Objective-C最初是作为一个定制的C预处理器+运行时使用的。前处理器直接输出C代码,在方法调用站点调用到运行时,类基本上是美化的C结构(现在仍然是,真的)。在进行嵌套调用时,Smalltalk语法有点模棱两可,这也很有帮助。因此,不管怎样,您经常不得不将方法调用括在括号中,例如((Class foo:15)bar:7),因此出于实际目的,Smalltalk实际上也需要括号。我猜想,这使构建Objective-C预处理器变得更容易了。更少的C语法必须被解析和仔细分析,以识别“消息”,并用等效的C代码替换它。如果没有括号,预处理器可能会对标签定义产生一些歧义。任何前面带有@的东西都是编译器指令,不一定是语言功能。@CodaFi您在这里混淆了预处理器指令(前面带有#)?“语言特征”这个术语很模糊,它肯定能涵盖任何Objc(或C++,或你所说的任何语言)的任何部分。Meh,迂腐。代码>@-指令指示编译器需要执行一些分析,而不仅仅是简单的预处理器内容。例如,
@autoreleasepool
指令可能扩展为objc_autoreleasepool[push/pop],而@interface指令通过iVar声明确定对象的大小及其在对象文件中的元类信息
@property
声明生成具有潜在非平凡生存期的setter和getter。这一切都可以用手来做,只是因为指令的缘故,我们没有这样做。