【问题标题】:How is this form of scoping called? [duplicate]这种范围界定的形式如何称呼? [复制]
【发布时间】:2014-01-29 00:40:20
【问题描述】:

我或多或少偶然发现了这种形式的范围界定

DataSource *dataSource =({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][0];
    dataSource.name    = self.destinations[idx][1];
    dataSource;
});

我认为这是创建和实例化对象和变量的好方法,因为临时变量只会在需要创建我真正需要和关心的对象时才存在。在上面的代码中idx 将在我将内部dataSource 写入外部dataSource 后立即消失,因为范围很快就会离开。
此外,我发现将完全实例化和配置的对象设置为外部对象这一事实很有吸引力。
实际上我什至不知道这是 C 或 Objective-C 的特性还是添加到 clang 的语法糖果。


@Unheilig
这是一种组织代码的语法。它不是块或闭包之类的东西。在代码的末尾,您只有一个完全实例化和配置的对象。

如果您只需要一个对象以将其作为参数传递给方法,但该对象的配置需要多个语句,这将派上用场。您可以传入语句表达式,而不是将其分配给局部临时变量。

[[MYViewController alloc] initWithDataSource:({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][@"address"];
    dataSource.name    = self.destinations[idx][@"name"];
    dataSource;
})];

在非 ARC 环境中,您甚至可以在表达式语句中调用 autorelease。

所以我猜这只是代码组织和很多个人品味。

【问题讨论】:

  • 我希望到目前为止它对您来说效果很好。你能举一个可能有用的场景吗?你会如何调用/调用它?提前致谢。
  • @Unheilig,看看我的编辑

标签: objective-c c clang


【解决方案1】:

它是一个 GCC 扩展,称为“语句表达式”,描述于 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

【讨论】:

  • 您应该将该网址的相关部分添加到您的答案中,以防链接损坏。
  • @CodeMaverick:答案是足够的 IMO。我要名字,格温达尔给了。另外他说这是一个 GCC 扩展。这是一个完美的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2013-04-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多