0

我想通过扩展一个类(如在Homebrew中)在 Ruby 中创建一个对象:

class Somepackage < Formula
    version "2.8"
    homepage "http://foo.bar.com/"
end

但是,我是一名 Ruby 新兵,我找不到一种方法来定义Formula适合我需要的类:

class Formula
    attr_reader :version, :homepage
    def self.version (version)
        @version = version
    end
end

这显然不起作用:

Somepackage.version #=> nil

(我需要它返回2.8

我知道这一定是一件非常简单的事情,但我尝试了各种组合,但就是做不到。

更新

好的,因此,感谢 Sergio 的回答,最终版本如下所示:

def property(*properties)
  properties.each do |prop|
    self.class_eval("def self.#{prop}(#{prop} = nil); @#{prop} = #{prop} if #{prop}; @#{prop}; end")
  end
end

class Formula
    property :version, :homepage
end

class Somepackage < Formula
   version "2.8"
   homepage "http://foo.bar.com/"
end
4

1 回答 1

2

请注意,您的attr_reader方法在实例级别。要给他们打电话,你需要这样做

Somepackage.new.version

这显然不是你的意图。您可以像这样将它们提升到班级级别:

class Formula
  class << self
    attr_reader :version, :homepage
  end

  def version(version)
    @version = version
  end
end

但这里也有一个问题。您的第二个版本version覆盖version来自attr_reader. 结果,您有一个可以设置值但不能返回的方法。经过一些实验,你最终会得到这样的结果:

class Formula
  def self.version(version = nil)
    if version
      @version = version
    end

    @version
  end
end

class Somepackage < Formula
  version "2.8"
end

Somepackage.version # => "2.8"

homepage. 或者,更好的是,编写一个生成这些方法的方法,这样你就可以做到

class Formula
  property :version, :homepage
end
于 2013-08-28T18:20:28.837 回答