在Ruby中将哈希作为参数传递

5

我有以下代码:

user = User.from_google(from_google_params)

  def from_google_params
    @from_google_params ||= {
      uid: auth.uid,
      email: auth.info.email,
      full_name: auth.info.name,
      avatar_url: auth.info.image
    }
  end

这里是 from_google 方法,哈希值被传递到该方法中。

def self.from_google(email:, full_name:, uid:, avatar_url:)

当我运行这个程序时,我得到了一个参数错误 ArgumentError (wrong number of arguments (given 1, expected 0; required keywords: email, full_name, uid, avatar_url)):

这是我在控制台中看到的:

>> from_google_params.inspect
=> "{:uid=>\"100373362533979950619\", :email=>\"marklocklear@extension.org\", :full_name=>\"Mark Locklear\", :avatar_url=>\"https://lh3.googleusercontent.com/a-/AOh14Gh1leKarrW8SCvxxwvaAcDkAISXYQ38k4xPQuC1Rg=s96-c\"}"
>> from_google_params.class
=> Hash

我该如何让这个工作起来?

1个回答

6
使用双星号运算符(**)将哈希转换为关键字参数。
user = User.from_google(**from_google_params)

Ruby 3.0中关键字和位置参数的分离是一个重大变化。在早期版本的Ruby中,如果最后一个参数是哈希,则将其强制转换为关键字,但这种行为已于Ruby 2.7中被弃用,并在Ruby 3.0中完全删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接