我在Sandi Metz的演讲here中偶然发现了这个功能。
似乎你可以定义一个类的initialize
函数来接受一个哈希(没有名字),并且它已经自动转换为带有键作为名称的参数?真的吗?这定义在哪里?这是一个例子:
class House
attr_reader :var1
attr_reader :var2
def initialize(var1: 'var1value', var2: 'var2value')
puts var1
puts var2
end
end
House.new
运行此文件将输出:
var1value
var2value
此外,看起来默认哈希与传入的值合并。例如:
class House
attr_reader :var1
attr_reader :var2
def initialize(var1: 'var1value', var2: 'var2value')
puts var1
puts var2
end
end
House.new(var2: 'newvar2value')
运行此命令将输出:
var1value
newvar2value
这看起来真的非常棒和有用的功能。我从未意识到这可以做到。它在某处记录了吗?或者有人可以解释这里发生了什么?
答案 0 :(得分:3)
Ruby 2.0引入了关键字参数。
documentation提供了详细信息,然后Ruby Rogues podcast对此进行了有趣的讨论。
请注意,这适用于任何方法,不仅适用于initialize
。
答案 1 :(得分:2)
在House
课程中,如果用户没有发送自己的值,您可以设置要发送给课程的默认参数。该默认参数是单个参数,哈希,具有键/值对。您通过为某个键发送自己的值来查看,该值将设置为您想要的新值。
如果你有很多参数,通常使用哈希作为参数传递更方便,因为你不必按特定顺序写所有参数。即..
def method(name, lname, age, city, state, phone, cell)
end
#vs...
def method({name: "", lname: "", age: "", city: ""})
end
您不必记住参数传递给方法的顺序。
以下是传递哈希参数的方便用法:
class Drink
attr_accessor :type, :flavor
def initialize(params = {})
@type = params.fetch(:type, 'orange')
@flavor = params.fetch(:flavor, 'sweet')
end
end
Drink.new() #=> orange / sweet
Drink.new(:type => 'apple') #=> apple / sweet
您可以将默认参数设置为其相对实例变量。如果参数未通过,则设置默认参数。