Ruby 将符号作为关键字参数传递?



我有一个方法,我想在其中使用关键字参数和case/when语句,其中我更喜欢使用符号:

def navigate_to(page:)
case page
when :inbox
# some code
when :archive
# some code
else
# some code
end
end

调用该方法时,这是正确的语法吗?

navigate_to page: :inbox

: :似乎有点奇怪。

关键字参数语法为:

key: value

如果键是page而值是符号:inbox,你确实有:

page: :inbox

您也可以改用位置参数:

def navigate_to(page)
# same as your code
end
navigate_to :inbox

是的,正确的语法是navigate_to page: :inbox.

虽然这是常见的 Ruby,但它很短,对于几个不同的东西是等效的。首先,牙套。

你实际上是在打电话:

navigate_to(page: :inbox)

其次,关键字参数模式源自作为参数的哈希。在出现关键字参数之前,一种常见的方法是传入哈希[1],如下所示:

def navigate_to(options)
page = options[:page]
end
navigate_to({ page: :inbox })

但是当方法调用中的最后一个参数是哈希时,可以省略{}

最后,哈希中的实际键。不久前(1.8 -> 1.9 IIRC)引入了以下简短版本:

{ :page => 'Some Value' },即{ page: 'Some Value' }。当Some Value是一个符号时,它就变成了{ page: :inbox }

所以,拿所有这些:

navigate_to page: :inbox

来源于:

navigate_to({ :page => :inbox })

这样读可能更有意义,或者知道它来自那个。

而且我知道 Ruby,也不是像大括号、()那样的红宝石主义者,这在令人难以置信的 DSL 中可以看出,例如 rspec,但我可以建议特别是新开发人员添加它们。它通常使代码更易于理解。

navigate_to(page: :inbox)可能比navigate_to page: :inbox更容易理解,尤其是当您开始通过其他方法调用时:navigate_to page page_from_session :user


[1] 但是,要强调的是,这并不是这里真正发生的事情。关键字参数和哈希参数确实不同,现在我们有了关键字参数。这只是说明了为什么语法是这样的。