ruby - 为什么 double splat 仅适用于符号键?

标签 ruby hash key symbols

双 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/

相关文章:

java - 如何检查两个二叉搜索树是否具有相同的精确键(忽略值)?

database - 平凡的 super 键可以被视为候选键吗?

ruby-on-rails - spree Action require_login 在分配给 before_action 过滤器时创建重定向循环

ruby - 为什么我的散列具有映射到多个值的相同键?

java - 通过 Java 中的用户输入实现更多的随机性

r - 如何以在 R 中生成人类可读输出的方式匿名化向量?

PHP最好的MD5多维数组方法?

ruby - 功能标志最佳实践 : condition inside or outside of a method?

ruby-on-rails - 为什么 Rails ActionMailer 6.1/Ruby 3.0 不忽略自签名 SMTP 证书?

ruby-on-rails - 创建模型后,searchkick是否会自动更新索引?