我有一个类:
class Configuration
def self.files
@@files ||= Array.new
end
end
现在不是这样做的:
irb(main):001:0> Configuration.files
=> [file, file, file]
我希望能够做到这一点:
irb(main):001:0> Configuration
=> [file, file, file]
但我无法弄清楚如何,任何想法?
我正在考虑为'配置'常量添加额外的方法,这是一个哈希。所以,如果我有......
Configuration = Hash.new
Configuration[:foo] = 'bar'
我希望能够保存此配置哈希常量,以便能够转储到我希望能够使用的YAML文件并加载...
Configuration.load
Configuration.save
我希望Configuration类看起来像
class Configuration
def self.save
open('config.yml', 'w') {|f| YAML.dump( self , f)}
end
def self.load
open('config.yml') {|f| YAML.load(f)}
end
end
答案 0 :(得分:6)
您可以通过向顶级对象添加一个隐式调用Configuration.files的方法来获得您正在寻找的效果,但是您无法真正引用类来调用它上面的方法。你可以将方法别名缩小,但你需要调用一些东西。
答案 1 :(得分:3)
irb的顶级只是对结果调用'inspect',所以通过覆盖它你可以自定义你在irb中看到的内容:
$ irb
>> class Configuration
>> def self.files
>> @@files ||= Array.new
>> end
>> def self.inspect
>> @@files.inspect
>> end
>> end
=> nil
>> Configuration.files << 1 << 2 << 3
=> [1, 2, 3]
>> Configuration
=> [1, 2, 3]
答案 2 :(得分:2)
你可以这样做:
class Configuration
(class << self; self; end).module_eval do
def files
['foo','bar','baz']
end
def to_s
files
end
end
end
这将定义Configuration.files方法,并说to string转换将返回该方法的结果。但我真的不确定你为什么要这样做。这似乎很不对。
答案 3 :(得分:0)
wpc@wpc-laptop:~$ irb
irb(main):001:0> 'a'
=> a
irb(main):002:0> def A
irb(main):003:1> end
=> nil
irb(main):004:0> A
NameError: uninitialized constant A
from (irb):4
from :0
irb(main):005:0> class A
irb(main):006:1> end
=> nil
irb(main):007:0> A
=> A
irb(main):008:0> class A
irb(main):009:1> (class ['g']
irb(main):012:3> end
irb(main):013:2> def to_s
irb(main):014:3> g
irb(main):015:3> end
irb(main):016:2> end
irb(main):017:1> end
=> nil
irb(main):018:0> A
=> g
irb(main):019:0> class B
irb(main):020:1> class def to_s
irb(main):022:3> 'g'
irb(main):023:3> end
irb(main):024:2> end
irb(main):025:1> end
=> nil
irb(main):026:0> B
=> g
irb(main):027:0> class B
irb(main):028:1> class def files
irb(main):030:3> ['a','b','c']
irb(main):031:3> end
irb(main):032:2> def to_s
irb(main):033:3> files
irb(main):034:3> end
irb(main):035:2> end
irb(main):036:1> end
=> nil
irb(main):037:0> B
=> abc
正确的解决方案是使用to_s的类'方法,但它返回的只是字符串;然后你可以设置inspect使用。请参阅以下'详细信息以获取帮助。
class A
class<<self
def to_s
......
end
end
end