【问题标题】:Ruby confusion on the use of "colons" [duplicate]Ruby对“冒号”的使用感到困惑[重复]
【发布时间】:2013-12-31 13:36:34
【问题描述】:

您好,我是 ruby​​ 新手 :) 我正在尝试寻找解释以了解在其语法中使用 ':' 的原因。

例如:

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

我们什么时候做:somethingsomething: 有什么区别。如果这是可谷歌搜索的,请给我一些关于谷歌关于这个主题的关键字的指示。到目前为止,Ruby Colon 的变体产生了很多不相关的结果。

【问题讨论】:

    标签: ruby syntax


    【解决方案1】:

    在这种情况下,您使用两个参数调用函数 post,第一个参数是符号 :create,第二个参数是带有键 :product 和值 @update 的哈希。

    这一行可以改写如下:

    post(:create, {:product => @update})
    

    key: value 样式是在 Ruby 1.9 中引入的。

    【讨论】:

    • 好的,这完全有道理。 Post 是将符号作为参数 1 并将产品哈希值与键变量更新的方法。惊人的!感谢您的帮助!
    【解决方案2】:

    简短的版本是:

    • 在标识符前面时,冒号表示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 的开头引入。 Hash key 语法在http://www.ruby-doc.org/core-2.0.0/Hash.html 开头。

    命名参数的概念有点棘手。参考跟随。

    顺便说一句,冒号也用在 if-then-else 运算符中,它代表else 运算符(例如condition ? this : that

    【讨论】:

      【解决方案3】:

      让我们从 :something 开始,这就是所谓的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
      

      现在是 something: 的后缀案例。这引爆了某物是散列中的键。下面是一个带有键 a"test" hash = {a: "test"} 的哈希,它也可以用像这样{:a => "test"} 的保持语法编写

      【讨论】:

        【解决方案4】:

        This has been answered before 答案将引​​导您撰写这篇精彩的文章。

        The Difference Between Ruby Symbols and Strings

        【讨论】:

        • 他并没有具体询问符号,而是如何使用两种不同的语法创建符号。
        • 天哪!好的。所以我们想向 post 方法发送一个名为 create 的不可变字符串!我知道我们不想破坏和妥协我们发送到帖子的论点。
        【解决方案5】:

        :something 在 Ruby 中被称为符号。它是一种字符串(尽管它不是String 类的实例),它永远不会被垃圾收集,并且每个字符串都只有一个化身。

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

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

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

        区别只是语法上的,哈希值是一样的。而且这种情况是唯一一种您可以将冒号放在符号后面的情况(因为在这种情况下它也充当哈希火箭)

        【讨论】:

        • 好的,所以对于表示为 :a 的不可变键,它包含一个可变字符串 b 作为可以更改的值。非常好。
        【解决方案6】:

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

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

        你可以将这一行改写为

        post :create, :product => @update
        

        这是一个压缩版本

        post :create, { :product => @update }
        

        在后一个版本中,:product 是哈希的键更加清楚。

        从 Ruby 1.9 开始,您可以使用 Hash 定义

        foo: "bar"
        

        而不是

        :foo => "bar"
        

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

        【讨论】:

        • Simon 感谢 post :create 将 create 作为 post 方法的参数。得到检查。谢谢。现在产品:@update 就像是说 product[update] ?
        • 不,@update 是一个实例变量,但除非您之前在规范中定义它,否则它的值是 nil@updateproduct[update] 之间没有相关性。
        • 好的,我确实有一个名为 @update 的变量:{ title: 'lorem ipsum', description: 'wibbles', image_url: 'lorem.jpg', price: 19.95 }
        猜你喜欢
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2011-06-12
        • 2014-10-03
        • 2020-08-21
        • 2018-08-15
        相关资源
        最近更新 更多