我想通过扩展一个类(如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
答案 0 :(得分: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