2017-06-14 31 views
1

我有一個方法爲register(key, val)的類。我試圖添加key作爲該類的實例變量,並將其設置爲val。現在,我嘗試使用self.instance_variable_set(':@' + key, val)但我得到這個錯誤:Ruby - 從字符串中設置類方法中的實例變量

in `instance_variable_set': `:@table' is not allowed as an instance variable name (NameError) 

我打電話register('table', {'key' => 'value'})

不知道如何正確地做到這一點?謝謝!

+1

@DaveNewton這是一個令人困惑的陳述。 – engineersmnky

+0

@DaveNewton *「如果你引用'self',這不是一個類方法。」*這對我來說沒什麼意義。 'self'可以引用一個'Class',就像它可以引用一個'Class'的實例一樣,如果我們對這個技術有所瞭解,所有的方法都是'instance_methods',因爲一切都是一個實例。 – engineersmnky

+0

出於好奇:錯誤信息真的很難理解嗎?你能否提供一些關於未來讀者如何改進的提示? –

回答

3

從您的方法中刪除:

self.instance_variable_set('@' + key, val)

此外,self可以是冗餘這裏。嘗試instance_variable_set('@' + key, val)

寧願在連接上使用插值。 instance_variable_set("@#{key}", val)

+0

謝謝你解決了這個問題! – user2309843

+0

我嘗試了插值方法,它使用雙引號但不是單引號,你知道這是爲什麼嗎? – user2309843

+1

@ achang27這是因爲,嗯...字符串插值在雙引號內工作,但不在單引號內。這就是[字符串文字](http://ruby-doc.org/core-2.4.1/doc/syntax/literals_rdoc.html#label-Strings)在Ruby中的工作方式。 – Stefan