Rubyの「参照によるパラメータの受け渡し」?
-
03-07-2019 - |
質問
Rubyでは、値型のセマンティクス(Fixnumなど)を使用してパラメーターを参照渡しできますか? C#の「 ref 」キーワードに似たものを探しています。
例:
def func(x)
x += 1
end
a = 5
func(a) #this should be something like func(ref a)
puts a #should read '6'
ところで。私はちょうど使用できることを知っています:
a = func(a)
解決
現在のバインディングを明示的に渡すことでこれを実現できます。
def func(x, bdg)
eval "#{x} += 1", bdg
end
a = 5
func(:a, binding)
puts a # => 6
他のヒント
Rubyは「参照渡し」をサポートしていません。まったく。すべてがオブジェクトであり、それらのオブジェクトへの参照は常に値によって渡されます。実際、この例では、参照のコピーを値で Fixnum
オブジェクトに渡します。
コードの問題は、 x + = 1
が渡された Fixnum
オブジェクトを変更せず、完全に新しい独立したオブジェクトを作成することです。
Javaプログラマーは Fixnum
オブジェクトを immutable と呼ぶと思います。
Rubyでは、参照渡しでパラメーターを渡すことはできません。たとえば、新しい値を返して変数aに割り当てるか、値を含む新しいクラスを作成して、このクラスのインスタンスを渡す必要があります。例:
class Container
attr_accessor :value
def initialize value
@value = value
end
end
def func(x)
x.value += 1
end
a = Container.new(5)
func(a)
puts a.value
次のトリックを試すことができます:
def func(x)
x[0] += 1
end
a = [5]
func(a) #this should be something like func(ref a)
puts a[0] #should read '6'
http://ruby-doc.org/core-2.1.5 /Fixnum.html
Fixnumオブジェクトには即値があります。これは、割り当てられたとき、または パラメータとして渡されると、への参照ではなく、実際のオブジェクトが渡されます そのオブジェクト。
また、 Rubyは値渡しされます。
ただし、ハッシュなどの複合オブジェクトは参照で渡されるようです:
fp = {}
def changeit(par)
par[:abc] = 'cde'
end
changeit(fp)
p fp
与える
{:abc=>"cde"}
所属していません StackOverflow