2017-06-17 65 views
0
class A 
    attr_reader :foo, :bar 
    def initialize 
     @foo = "foo" 
     @bar = 2 
     ..... 
     ..... 
     # many variables like this 
    end 
end 

在這個類中有2個變量。我想給attr_accessor所有的實例變量,比如「attr_accessor *」。這可能嗎?如何給attr_accessor類ruby中的所有實例變量

+0

如果你想少打字這樣的事情,也有類似(我的)[attr_extras](https://github.com/barsoom/attr_extras)的庫去掉了一些樣板文件。 –

+1

當你舉一個例子時,請包含完整的代碼。行'''不需要,但需要任何想要剪切並粘貼代碼的人去除它們。他們應該被刪除。示例中給出的數據相同(此處不相關)。例如'[1,5,2 ...]'應該寫成'arr = [1,5,2]',數組的大小足以說明問題的重點。通過包含變量'arr',讀者可以在回答和評論中引用它,而不必定義它。 –

回答

2

一個有點hackish,並僅限於您的具體的例子,但剛剛回答的問題(在其第二化身):

class A 
    def initialize 
    @foo = 1 
    @bar = 2 
    #add as many instance variables you need 
    end 
    attr_accessor *A.new.instance_variables.map { |s| s[1..-1] } 
end 

obj = A.new 
obj.foo  #=> 1 
obj.bar  #=> 2 
obj.bar = 3 #=> 3 
obj.bar  #=> 3 

更多信息,請參見Object#instance_variables

2

你的類不知道在#initialize中分配的變量。做你要求的東西很少見,所以我會用「不」來回答。不管怎樣,技術上都是可能的,但我不會沿着這條道路前進。

+0

如果你想知道如何做,我會用'method_missing'和'define_method'來完成。 –

+0

但是,完全不建議 –

+0

對不起,我更新了這個問題。請爲此建議我 – Elangovan

3

你想要的是已經實現,它被稱爲OpenStruct

require 'ostruct' 
a = OpenStruct.new(foo: 1, bar: 2) 
a.foo # => 1 
a.bar # => 2 

至少,我猜這是你想要什麼

+0

對不起,我更新了這個問題。請爲此建議我 – Elangovan

1

另一種可能性是使用哈希作爲屬性。由於您只能訪問散列,而不需要替換它,因此attr_reader就足夠了。對於初始化,您可以使用**kwargs

class A 
    attr_reader :attributes 
    def initialize(**kwargs) 
    @attributes = kwargs 
    end 
end 

a = A.new(foo: 1, bar: 2) 
puts a.attributes[:foo] 
#=> 1 
puts a.attributes[:bar] 
#=> 2 

a.attributes[:baz] = 3 
puts a.attributes[:baz] 
# => 3 

puts a.attributes[:bak].inspect 
# => nil 
+0

對不起,我更新了這個問題。請爲此建議我 – Elangovan

1

一個結構定義了一個初始化方法的類和一氣呵成的所有訪問者:

A = Struct.new(:foo, :bar) 

an_a = A.new("foo", 1) 
p an_a.methods # => [:foo, :bar, :foo=, :bar=, ...] 
+0

對不起,我更新了問題。請爲此建議我 – Elangovan