是否有覆蓋變量而不復制其名稱的方法?例如,當我想改變my_var = '3'
爲整數,我必須做這樣的事情:覆蓋變量而不重複名稱
my_var = my_var.to_i
有沒有辦法做到這一點不復制變量的名字?我想要做這樣的事情:
my_var = something_const.to_i
對於數字存在+=
,-=
等,但有普遍的方式,爲所有的方法做到這一點?
是否有覆蓋變量而不復制其名稱的方法?例如,當我想改變my_var = '3'
爲整數,我必須做這樣的事情:覆蓋變量而不重複名稱
my_var = my_var.to_i
有沒有辦法做到這一點不復制變量的名字?我想要做這樣的事情:
my_var = something_const.to_i
對於數字存在+=
,-=
等,但有普遍的方式,爲所有的方法做到這一點?
沒有辦法將字符串轉換爲像這樣的整數,而無需重複變量名稱。方法如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!
對於上面所討論的原因。
是的,給一個不可能的問題給一個「例子」有點難;)......也許你使用String#replace的想法是一個更好的嘗試,但它仍然失敗:TypeError:沒有隱式轉換Fixnum到字符串。 –
我已經用你的建議更新了我的答案,謝謝:) –
沒有通用的'。='如果這就是你要求的。你爲什麼需要這個? – ndn