关于使用“冒号”的Ruby混淆

时间:2013-12-12 22:17:36

标签: ruby syntax

您好我是红宝石新手:)我正在尝试寻找解释,以理解在其语法中使用':'。

E.g:

test "should create product" do
   assert_difference('Product.count') do
   post :create, product: @update
  end
end

我们何时执行:something而不是something:有什么区别。如果这是可谷歌的,请给我一些关于谷歌关于这个主题的关键字的一些指示。到目前为止,Ruby Colon的变化产生了许多不相关的结果。

6 个答案:

答案 0 :(得分:6)

在这种情况下,您使用两个参数调用函数post,第一个参数是符号:create,第二个参数是密钥:product和值{{ 1}}。

这一行可以重写如下:

@update

在Ruby 1.9中引入了post(:create, {:product => @update}) 样式。

答案 1 :(得分:2)

在这两种情况下,:foo都会引用符号:foo

但是,在第一种情况下,Symbol作为值传递给post方法。在第二种情况下,符号:foo用作哈希的键。

您可以将该行重写为

post :create, :product => @update

的压缩版本
post :create, { :product => @update }

在后一版本中,:product更为明确是Hash的关键。

从Ruby 1.9开始,您可以使用

定义哈希
foo: "bar"

而不是

:foo => "bar"

1.9语法已被大量采用,因为与“Rocket语法”(版本:foo => "bar")相比,它更简洁。

答案 2 :(得分:2)

答案 3 :(得分:1)

简短版本是:

  • 在标识符前面,冒号标识Symbol字面值(例如:name:'string':"string"
  • Hash文字中跟随标识符时,冒号会标识作为符号的键,如{key: value}中所示。
  • 在方法参数列表的上下文中,作为定义的一部分或作为调用的一部分,它表示命名参数(例如def foo(param1: 1, param2: 2)foo(param1: 1, param2: 2))。在某些情况下,这些命名参数也被解释为散列键。

由于此时有no definitive source for the Ruby language,因此很难将您指向特定来源。我建议您咨询Ruby documentation site并找到您喜欢的来源。所有这些主题都将在那里讨论。

http://www.ruby-doc.org/core-2.0.0/Symbol.html的开头引入了Symbol文字语法。 Hash键语法包含在http://www.ruby-doc.org/core-2.0.0/Hash.html的开头。

命名参数概念有点棘手。参考如下。

另外,冒号也用在if-then-else运算符中,代表else运算符(例如condition ? this : that

答案 4 :(得分:1)

:something在Ruby中被称为符号。它是一种字符串(虽然它不是String类的一个实例),它从不被垃圾收集,并且每个字符串只有一个。

您总是将符号写为:something:"something"(即使用前导冒号),但在一个可选情况下除外:在使用Ruby 1.9中引入的新哈希语法时将其用作键。< / p>

因此这两个哈希值100%相同:

{:a => "b"}
{a: "b"}

区别仅在于语法上,哈希是相同的。这种情况是唯一一个将冒号放在符号后面的情况(在这种情况下它也可以作为哈希火箭)

答案 5 :(得分:0)

让我们从开始:这就是所谓的symbol。符号本质上是字符串,但每个符号只有一个实例,这在上面的链接中用以下示例说明。

module One
  class Fred
  end
  $f1 = :Fred
end
module Two
  Fred = 1
  $f2 = :Fred
end
def Fred()
end
$f3 = :Fred
$f1.object_id   #=> 2514190
$f2.object_id   #=> 2514190
$f3.object_id   #=> 2514190

现在针对某事的后缀案例:。这引爆了某些东西是哈希中的关键。以下是包含值为a "test"的键hash = {a: "test"}的哈希值,它也可以使用保持语法编写,如{:a => "test"}