1

我在实例变量中有一些变量(其他方法可以访问该变量),其类型是散列。

如果我不希望哈希 @iw2 中的所有成员都应用 attr_accessor

只有@iw2[:dir] 可以被其他人修改。

@iw2 ={}
@iw2[:dir] = "#{Rails.root}/#{ENV["module_handy_network_tools_src_path"]}"
@iw2[:prog_path] ="#{@iw2[:dir]}/#{ENV["module_handy_network_tools_prog_path"]}"

于是我就这样写了

attr_accessor :iw2[:dir]

但我得到了错误

TypeError (can't convert Symbol into Integer):
  app/helpers/handy_network_tools_helper.rb:8:in `[]'

如何解决这个问题,在此先感谢。

[2] pry(#<HandyNetworkToolsController>)> @iw2.class
=> Hash
4

1 回答 1

3

编辑

当您发现自己有许多具有相同前缀的方法时(iw2在这种情况下),这表明那里有一个隐藏的对象。这个怎么样?更好的?

class Iw2
  def initialize(hash)
    @dir = hash[:dir]
    @prog_path = hash[:prog_path]
  end

  attr_accessor :dir, :prog_path
end


class MyClass
  def initialize
    @iw2 = Iw2.new(:dir => "a rails path",
               :prog_path => "some another rails path")
  end

  delegate :dir, :prog_path, :to => :@iw2
end


mc = MyClass.new
mc.dir # => "a rails path"
mc.prog_path # => "some another rails path"

原始答案

好吧,attr_accessor不是那样工作的。您始终可以使用老式的 getter/setter。

def iw2_dir
  @iw2[:dir]
end

def iw2_dir=(dir)
  @iw2[:dir] = dir
end

然后,您可以实现自己的attr_sub_accessor将为您生成此类方法。

attr_sub_accessor :iw2, :dir
attr_sub_accessor :iw2, :prog_path

(我认为在这种情况下,明确的 getter/setter 更好)

于 2013-11-01T05:18:20.963 回答