在Ruby中传递散列作为参数



我有以下代码:

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

我怎样才能做到这一点?

使用双splat运算符(**(将散列转换为关键字参数。

user = User.from_google(**from_google_params)

在Ruby3中,关键字和位置参数的分离是一个很大的变化。如果最后一个位置参数是hash,Ruby的早期版本会将其强制转换为关键字——这种行为在Ruby 2.7中被贬低,在3.0中被完全删除。

最新更新