如何实现选项哈希?包含选项哈希的类的结构如何?假设我有一个人班。我想实现一个方法,例如 my_age ,当被调用时,它会使用选项哈希告诉我我的年龄。
问问题
6461 次
4 回答
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
于 2013-02-14T06:59:16.290 回答
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
于 2013-02-14T02:44:07.993 回答
1
值得一提的是,Ruby 2.1 增加了传递不需要按特定顺序排列的关键字参数的功能,您可以将它们设为必需或具有默认值。
放弃选项散列减少了提取散列选项的样板代码。不必要的样板代码增加了拼写错误和错误的机会。
同样使用在方法签名本身中定义的关键字参数,您可以立即发现参数的名称,而无需阅读方法的主体。
必需的参数后跟一个冒号,而具有默认值的参数按照您的期望在签名中传递。
例如:
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
于 2014-11-15T07:45:48.417 回答
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
于 2016-04-23T05:08:24.140 回答