返回数组的类

时间:2009-08-18 03:11:21

标签: ruby

我有一个类:

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]

但我无法弄清楚如何,任何想法?


@glenn jackman:

我正在考虑为'配置'常量添加额外的方法,这是一个哈希。所以,如果我有......

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

4 个答案:

答案 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