【问题标题】:Why are instances created using a 'literal syntax' known as 'literals'?为什么使用称为“文字”的“文字语法”创建实例?
【发布时间】:2015-02-04 19:56:10
【问题描述】:

令我困扰的是为什么“字面”一词被用来指代NSString 和NSArray 等类的实例。我只看到用于参考NSString 的术语并且天真我认为它与它“字面上”是一个字符串有关,即在引号之间。抱歉,如果这听起来很可悲,但我就是这么想的。

然后今天我了解到NSArray 的某些实例也可以称为文字实例,即使用“文字语法”创建的类的实例。

【问题讨论】:

  • literal = 在编译时硬编码到代码中。例如:@[ @"foo", @"bar" ] 是一个数组字面量。将其与您在运行时动态获取的内容进行比较(例如解析某些 JSON 的结果等)

标签: objective-c terminology literals objective-c-literals


【解决方案1】:

正如@Linuxios 所指出的,文字语法内置于语言中。不过,它们比你想象的要广泛。文字只是意味着在源中编码了实际值。所以在 ObjC 中有相当多的字面语法。例如:

  • 1 - int
  • 1.0 - 双重
  • 1.0f - 浮动
  • "a" - C 字符串
  • @"a" - NSString
  • @[] - NSArray
  • ^{} - 函数

是的,块只是函数字面量。它们是可分配给符号名称(例如变量或常量)的匿名值。

一般来说,文字可以存储在文本段中,并在编译时(而不是在运行时)计算。如果我没记错的话,数组文字目前被扩展为等效代码并在运行时进行评估,但@"..." 字符串文字被编码为二进制作为静态数据(至少现在是;非 Apple 版本的 gcc 用于编码我记得的构造静态字符串的实际函数调用)。

【讨论】:

  • 是的,@[...] 是 arrayWithObjects:count:,这就是你不能在文件的顶层使用 NSStrings 以外的文字的原因。
  • 真的吗?块是函数文字?我认为它们在语言级别上是根本不同的,因为 C 函数不是任何类型的闭包。
  • C 函数是一种闭包。它们关闭了定义它们的当前词法范围。因此,在当前文件中定义的变量(但在函数本身之外)将被关闭,就像在块中一样。块与 C 中的函数密切相关。我认为您的意思是函数 pointers 不是任何类型的闭包,我同意这一点。
  • @Linuxios:块是implemented as a certain interesting kind of struct,但公平地说它们确实是字面函数。
  • @shinnyWhack “文本段”是程序代码在可执行文件中的位置。这只是文件的那部分的一个旧术语。 en.wikipedia.org/wiki/Code_segment
【解决方案2】:

文字语法或文字只是使用语言内置的专用语法创建的对象,而不是使用用于创建对象的常规语法(无论是什么)。

这里我创建了一个字面量数组:

NSArray* a = @[@"Hello", @"World"];

就所有意图和目的而言,这等同于:

NSArray* a = [NSArray arrayWithObjects:@"Hello", @"World", nil];

第一个被称为文字,因为@[] 语法内置于创建数组的语言中,就像@"..." 语法内置于创建NSStrings 一样。

【讨论】:

    【解决方案3】:

    “literal”一词用于指代类的实例

    它实际上并不是指实例;创建对象后,创建方式无关紧要:

    NSArray * thisWasCreatedWithALiteral = @[@1, @2];
    NSArray * butWhoCares = thisWasCreatedWithALiteral;
    

    “文字”部分只是特殊语法@[@1, @2],并且

    它与它“字面上”是一个字符串有关,即在引号之间。

    完全正确:这是数组的写出表示,而不是使用构造方法创建的表示,例如arrayWithObjects:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 2014-09-03
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多