创建自定义方法

时间:2014-12-10 19:07:48

标签: ruby arrays class methods

尝试在类中提取内部方法的最佳实践/语法是什么?

class Foo

  def initialize
  end

  def get_value
    array = (API CALL TO GET ARRAY)
    array.array_lookup("Bar")
  end

  def array_lookup(query)
    self.each do |hash|
      if hash[:key] == query
         p hash[:value]
      end
    end
  end

end

foo = Foo.new
foo.get_value #=> : undefined method `array_lookup' for #<Array:0x007fd3a49a2ca0 (NoMethodError)

错误消息告诉我,我的数组对象不知道如何回应我的方法,因为我有一个没有这种方法的数组,尽管我有这个方法。想知道如何解决这个和类似的用途。我是否会覆盖数组类?我改变了我的自我吗?

2 个答案:

答案 0 :(得分:1)

array_lookup是Foo的方法。所以在Foo类中,你可以通过

来调用它
array_lookup("Bar")

(不含array.

答案 1 :(得分:0)

这样的事情怎么样?您将自定义对象转换为Array的子​​类,以便获得像#each这样的数组方法。实际上,想一想,更好的实现可能包括将Enumerable模块混合到您的自定义类中(思考组合而不是继承)。

class Foo < Array
  # More robust to change in application if you allow passing
  # the query into this method. Just a suggestion.
  def get_value(query)
    request_data
    lookup(query)
  end

protected

  def request_data
    # API call to get data, assume this is array with contents
    data = []
    # Set contents of this object to contents of returned array
    replace(data)
  end

  def lookup(query)
    each do |hash|
      if hash[:key] == query
        puts hash[:value]
      end
    end
  end
end

foo = Foo.new
foo.get_value("BAR")