如何实现选项哈希?具有选项哈希的类的结构如何?说我有一个人课。我想实现一个像my_age这样的方法,当被调用时会告诉我使用选项哈希的年龄。
答案 0 :(得分:6)
你可以这样做:
class Person
def initialize(opts = {})
@options = opts
end
def my_age
return @options[:age] if @options.has_key?(:age)
end
end
现在你可以打电话给这样的年龄
p1 = Person.new(:age => 24)<br/>
p2 = Person.new
p1.my_age # => 24<br/>
p2.my_age # => nil
答案 1 :(得分:3)
class Person
def birth_date
Time.parse('1776-07-04')
end
def my_age(opts=nil)
opts = {
as_of_date: Time.now,
birth_date: birth_date,
unit: :year
}.merge(opts || {})
(opts[:as_of_date] - opts[:birth_date]) / 1.send(opts[:unit])
end
end
答案 2 :(得分:1)
值得一提的是,Ruby 2.1增加了传递不需要按特定顺序排列的关键字参数的功能,并且可以使它们成为必需或具有默认值。
抛弃选项哈希减少了样板代码以提取哈希选项。不必要的样板代码增加了拼写错误和错误的机会。
此外,在方法签名本身中定义了关键字参数,您可以立即发现参数的名称,而无需阅读方法的主体。
必需的参数后面跟一个冒号,而带有默认值的args会按照您的预期在签名中传递。
例如:
class Person
attr_accessor(:first_name, :last_name, :date_of_birth)
def initialize(first_name:, last_name:, date_of_birth: Time.now)
self.first_name = first_name
self.last_name = last_name
self.date_of_birth = date_of_birth
end
def my_age(as_of_date: Time.now, unit: :year)
(as_of_date - date_of_birth) / 1.send(unit)
end
end
答案 3 :(得分:0)
在Ruby 2.x中,您可以使用**
运算符:
class Some
def initialize(**options)
@options = options
end
def it_is?
return @options[:body] if @options.has_key?(:body)
end
end