双 splat 运算符 **
似乎只适用于键为符号的哈希。例如,当键是字符串时,它将不起作用。两种方式都是如此。用于 build :
def foo **; end
foo(:a => 3) #=> nil
foo("a" => 3) #=> ArgumentError: wrong number of arguments (1 for 0)
和破坏:
def bar *; end
bar(**{:a => 3}) #=> nil
bar(**{"a" => 3}) #=> TypeError: wrong argument type String (expected Symbol)
为什么仅限于符号键?
这可能与命名关键字符号 a: 3
与 hash with symbol keys 的语法糖重合有关,但如上所示,double splat 适用于普通哈希符号 :a => 3
,所以我不确定。
最佳答案
我最近遇到了这样的事情。
如果您在 Rails 中并且您有一个采用关键字参数的方法并且您有一个要发送给它的强参数散列,您可以在参数散列上使用 symbolize_keys
并且它将正确地分离出参数,不需要双拼。
型号
class ContactForm
def initialize(name:, email:)
@name = name
@email = email
end
# Other stuff
end
Controller
class ContactController < ApplicationController
def send_mail
@contact_form = ContactForm.new(contact_params)
if @contact_form.submit
# Do stuff
end
end
def contact_params
params.require(:contact_form).permit(:name, :email).symbolize_keys
end
end
关于ruby - 为什么 double splat 仅适用于符号键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191747/