在这种情况下解释哈希火箭

时间:2013-10-03 08:49:58

标签: ruby

我刚刚编写了这段代码,虽然我不完全确定原因,但仍有效:

scope = scope.where(Sequel.qualify(:meeting_graphs, :id) => query.ids)

我特别谈论哈希火箭。

以前的代码就是这个,这很有道理:

scope = scope.where(id: query.ids)

我不明白的第一件事就是当我用冒号取代哈希火箭时,这是不行的,我认为它是首选语法:

scope = scope.where(Sequel.qualify(:meeting_graphs, :id): query.ids)

Sequel.qualify返回一个对象,这个对象也让我感到困惑,因为我认为它会返回一个符号。

任何人都可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

  1. 只有当key是文字符号时,新的哈希语法才有效。

  2. Sequel.qualify返回限定符对象标识列。这是可能的,因为每个对象都可以是Ruby中的哈希键。

答案 1 :(得分:1)

  • 虽然我不完全确定为什么

    ,但仍有效

    只要Sequel.qualify(:meeting_graphs, :id)有效,它就可以成为哈希的关键。任何对象都可以是哈希的键。这就是原因。

  • 为什么当我用冒号

    替换哈希火箭时,这不起作用

    即使Sequel.qualify(:meeting_graphs, :id)原来是一个符号,冒号也不会起作用,因为它是文字符号的一部分。它不是适用于已经制作的Ruby对象的方法或关键字。

答案 2 :(得分:0)

您将关键字传递给函数,关键字使用Hash语法。

有许多方法可以在ruby中定义哈希值,并且在使用函数的方式中,一种语法不起作用。

def return_one_symbol
   'one'.to_sym
end

hash_syntax1 = {:one => '1'}
hash_syntax2 = {one: '1'}
p hash_syntax1 # => {:one=>"1"}
p hash_syntax2 # => {:one=>"1"}

hash_syntax1_function = {return_one_symbol => '1'}
hash_syntax2_function = {return_one_symbol: '1'}
p hash_syntax1_function # => {:one=>"1"}
p hash_syntax2_function # => {:return_one_symbol=>"1"}

请参阅此帖子了解更多信息:

Is there any difference between the `:key => "value"` and `key: "value"` hash notations?