2016-09-18 9 views
3

名前をコピーせずに変数を上書きする方法はありますか?変数の名前をコピーせずにこれを行う方法は名前を繰り返さずに変数を上書きする

my_var = my_var.to_i 

あります:私は整数にmy_var = '3'を変更する場合たとえば、私はこのような何かをしなければなりませんか?私はこのような何かをしたい:-=など+=が存在する番号については、

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をStringに変換する '。 –

+0

私はあなたの提案で、私の答えを更新しました、ありがとう:) –

関連する問題