我希望通过扩展类(如自制软件中的类)在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)
我知道这一定是一件非常简单的事情,但我尝试了各种组合,但就是做不到。
更新
好的,感谢塞尔吉奥的回答,最后的版本如下:
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发布于 2013-08-28 18:20:28
注意,您的attr_reader方法位于实例级别。要打电话给他们你就得这么做
Somepackage.new.version这显然不是你的意图。你可以像这样把他们提升到班级级别:
class Formula
class << self
attr_reader :version, :homepage
end
def version(version)
@version = version
end
end但这里也有个问题。第二个版本的version覆盖了来自attr_reader的version。因此,您有一个可以设置值但不能返回的方法。在做了一些实验之后,你最终会得到这样的结果:
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
endhttps://stackoverflow.com/questions/18495270
复制相似问题