【问题标题】:Ruby: colon before vs after [duplicate]Ruby:冒号之前与之后[重复]
【发布时间】:2014-08-30 23:04:39
【问题描述】:

在使用 Ruby 时,我总是与 : 混淆。

谁能解释一下我什么时候应该在变量名之前使用它,比如:name,什么时候我应该在变量名之后使用它,比如name:

一个例子是崇高的。

【问题讨论】:

  • 起初以为这是个骗局,但我能找到的所有问题似乎都没有提到较新的哈希语法 { key: val }
  • 这些问题不都涵盖了吗? 12345
  • 在不同程度上,但尤其是第一个。找的时候没找到。
  • 这应该也很有用:What is the colon operator in Ruby?
  • Ruby 2.1 引入了“必需的关键字参数”,用尾随冒号定义。见robots.thoughtbot.com/ruby-2-keyword-arguments这就是为什么这个问题被错误地视为“重复”。

标签: ruby


【解决方案1】:

这与变量完全无关。

:fooSymbol 文字,就像 'foo'String 文字和 42Integer 文字一样。

foo: 用在三个地方:

  • 作为Symbol 文字的替代语法作为Hash 文字的键:{ foo: 42 } # the same as { :foo => 42 }
  • 在声明关键字参数的参数列表中:def foo(bar:) end
  • 在用于传递关键字参数的参数列表中:foo(bar: 42)

【讨论】:

  • 这一行“作为符号文字的替代语法作为哈希文字的键:{ foo: 42 } # 与 { :foo => 42 } 相同”删除了我所有的问题。谢谢。
  • without hash values 的语法是什么,例如observe :post_action, :post_revision 是什么意思?
  • @DanDascalescu:这是一条消息发送,将消息observe 发送到self,带有两个参数:post_action:post_revision
【解决方案2】:

在创建Hash 时,欢迎您参与:

{:name => "foo"}
#or
{name: 'foo'} # This is allowed since Ruby 1.9

但基本上:name 是Ruby 中的Symbol 对象。

来自docs

当您的键始终是符号时,哈希允许另一种语法形式。而不是

options = { :font_size => 10, :font_family => "Arial" }

你可以这样写:

options = { font_size: 10, font_family: "Arial" }

【讨论】:

  • JavaScript 样式表示法要求符号为 valid labels,因此您不能将其与各种有效符号一起使用,例如 :$set(在使用 MongoDB 时很常见)、:'where is pancakes house?'、@ 987654332@, :@x, ...
  • 不,这只是我对 Ruby 的不满。这一定是 Matz 对 Ruby 做过的最令人困惑的事情 :(
  • @muis waytooshort,让我们开始一个列表。 singleton class vs. metaclass vs. anonymous class, reduce vs inject 等怎么样?
  • Arup,请向@muistooshort 澄清您的评论地址。哪个海?加勒比海最大深度为 6,946 米,亚速海仅 14m。
  • @dlu,我想这取决于 Arup 所说的“海”是什么意思。如果他指的是世界海洋,马里亚纳海沟是合适的;如果他指的是被视为海洋的水体(并且通常在其名称中包含“海”),那将是加勒比海。无论如何,我们都同意 mu 太短是一个非常深刻的思想家。
【解决方案3】:

您可以在创建哈希之后使用它。

当你想要引用一个符号之前,你会使用它。

在 Arup 的示例中,{name: 'foo'} 您正在创建一个符号,并将其用作键。

稍后,如果该哈希存储在变量 baz 中,您可以将创建的键作为符号引用:

baz[:name]

【讨论】:

  • 但是当使用符号作为哈希字面量中的键时,您不能总是使用 JavaScript 样式表示法,例如 :$set => { ... }
  • 这是真的。也有例外。我认为这个问题只是一些例子。再次阅读问题... :)
  • 我以为我提到了 JavaScript……但不是我。
【解决方案4】:

:name 是一个符号。 name: "Bob" 是一种特殊的简写语法,用于定义哈希,符号 :name 为键,字符串 "Bob" 为值,否则将写为 { :name => "Bob" }

【讨论】:

  • :$set 也是一个符号,但{ $set: 6 } 是一个语法错误。
  • @muistooshort 按照你的说法{ :$set => 6 } 是一种更安全的游戏方式。
猜你喜欢
  • 2022-01-06
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多