2016-09-18 122 views
3

是否有覆蓋變量而不復制其名稱的方法?例如,當我想改變my_var = '3'爲整數,我必須做這樣的事情:覆蓋變量而不重複名稱

my_var = my_var.to_i 

有沒有辦法做到這一點不復制變量的名字?我想要做這樣的事情:

my_var = something_const.to_i 

對於數字存在+=-=等,但有普遍的方式,爲所有的方法做到這一點?

+0

沒有通用的'。='如果這就是你要求的。你爲什麼需要這個? – ndn

回答

4

沒有辦法將字符串轉換爲像這樣的整數,而無需重複變量名稱。方法如String#upcase!Array#flatten!通過工作變異的對象;但是,不可能定義像String#to_i!這樣的方法,因爲我們將該對象轉換爲不同類的實例。

例如,這裏是一個(失敗)試圖定義這樣的方法:

# What I want to be able to do: 
# my_var = "123" 
# my_var.to_i! # => my_var == 123 

class String 
    def to_i! 
    replace(Integer(self)) 
    end 
end 

my_var = "123" 
my_var.to_i! # TypeError: no implicit conversion of Fixnum into String 

...而且,即使這個代碼是有效的,它仍然提供任何性能增益,因爲一個新的對象仍在創建。

至於你的+=-=例子,這些其實都是簡單的簡寫:

x += 1 
# Is equivalent to: 
x = x + 1 

如此反覆,沒有性能增益這裏要麼;只是稍微好一些的語法。一個很好的問題是,why doesn't ruby support a ++ operator?如果這樣的操作員存在,那麼它提供性能增益......但我會讓你自己研究爲什麼這是從語言中缺少。

因此,要總結,

is there universal way to do this for all methods?

號的特殊運營商如+=-=|=&=都是預定義的;沒有「廣義」版本,如method_name=

您也可以定義變異對象的方法,但只有在適當的時候。這種方法通常以!命名,被稱爲「爆炸方法」,並有一個「非爆炸」的方法。上String物體,例如,有String#capitalize!(和String#capitalize),String#delete!(和String#delete),String#encode!(和String#encode),....但沒有String#to_i!對於上面所討論的原因。

+0

是的,給一個不可能的問題給一個「例子」有點難;)......也許你使用String#replace的想法是一個更好的嘗試,但它仍然失敗:TypeError:沒有隱式轉換Fixnum到字符串。 –

+0

我已經用你的建議更新了我的答案,謝謝:) –