2008-09-08 127 views
2

對於一個項目,我在Ruby中工作,我重寫的method_missing方法,這樣我可以用一個方法調用這個樣子,類似於一個ActiveRecord對象設置變量設置變量:紅寶石方法名

Object.variable_name= 'new value'

但是,在實現這個之後,我發現很多變量名都有句號(。)。我發現這個解決方法:

Object.send('variable.name=', 'new value')

不過,我想知道有沒有辦法逃避的時期,這樣我可以使用

Object.variable.name= 'new value'

回答

9

不要這麼做!

試圖創建在您的語言中無效的標識符不是一個好主意。如果你真的想設置這樣的變量,使用屬性宏:

attr_writer :bar 
attr_reader :baz 
attr_accessor :foo 

好了,現在你已經被警告了,這裏是如何做到這一點。每次獲得常規訪問者時,只需返回同一個類的另一個實例,並隨時收集所需的信息。

class SillySetter 
    def initialize path=nil 
    @path = path 
    end 

    def method_missing name,value=nil 
    new_path = @path ? "#{@path}.#{name}" : name 
    if name.to_s[-1] == ?= 
     puts "setting #{new_path} #{value}" 
    else 
     return self.class.new(path=new_path) 
    end 
    end 
end 

s = SillySetter.new 
s.foo = 5    # -> setting foo= 5 
s.foo.bar.baz = 4  # -> setting foo.bar.baz= 4 

我不想鼓勵紅寶石sillyness,但我就是控制不住自己!

0

如果沒有改變的規範名稱的希望,你可以手動別名getter和setter方法:

def variable_name 
send 'variable.name' 
end 

def variable_name=(value) 
send 'variable.name=', value 
end 
1

我能想到的這樣做的唯一原因,就是如果你真的真的很討厭的人誰在你之後將會保持這個代碼。

我並不是說'他跑過我的狗'的仇恨。

我的意思是真正的熱氣騰騰的寺廟仇恨脈脈。

所以,總之,不要。 :-)