如何在Ruby中实现选项哈希?

如何实现选项哈希? 具有选项哈希的类的结构如何? 说我有一个人课。 我想实现一个像my_age这样的方法,当被调用时会告诉我使用选项哈希的年龄。

你可以这样做:

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)
p2 = Person.new p1.my_age # => 24
p2.my_age # => nil
 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 

可能值得一提的是,Ruby 2.1增加了传递不需要按特定顺序排列的关键字参数的function,并且可以使它们成为必需或具有默认值。

抛弃选项哈希减少了样板代码以提取哈希选项。 不必要的样板代码增加了拼写错误和错误的机会。

此外,通过方法签名本身定义的关键字参数,您可以立即发现参数的名称,而无需读取方法的主体。

必需的参数后跟冒号,而带有默认值的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 

在Ruby 2.x中你可以使用**运算符:

 class Some def initialize(**options) @options = options end def it_is? return @options[:body] if @options.has_key?(:body) end end