【问题标题】:How to implement options hashes in Ruby?如何在 Ruby 中实现选项哈希?
【发布时间】:2013-01-29 18:54:09
【问题描述】:

如何实现选项哈希?包含选项哈希的类的结构如何?假设我有一个人班。我想实现一个方法,例如 my_age ,当被调用时,它会使用选项哈希告诉我我的年龄。

【问题讨论】:

  • 我想我不明白。您认为“使用选项散列告诉我我的年龄”和“不使用选项散列告诉我我的年龄”之间的区别是什么。如果更容易解释,请使用代码示例(在 `backticks` 中)
  • 我更新了我最初的问题。当您创建类的实例时,我仍然对如何实现一个可以采用选项哈希的类感到困惑。

标签: ruby hash options


【解决方案1】:
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】:

    你可以这样做:

    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
    

    【讨论】:

      【解决方案3】:

      值得一提的是,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
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-17
          • 1970-01-01
          • 2016-11-02
          • 1970-01-01
          • 2018-04-24
          • 2011-01-19
          • 1970-01-01
          相关资源
          最近更新 更多