web-dev-qa-db-ja.com

Rubyの「参照によるパラメータの受け渡し」?

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)
26

これは、現在のバインディングを明示的に渡すことで実現できます。

def func(x, bdg)
  eval "#{x} += 1", bdg
end

a = 5
func(:a, binding)
puts a # => 6
31
jmah

Rubyは「参照渡し」をまったくサポートしていません。すべてがオブジェクトであり、それらのオブジェクトへの参照は常に値によって渡されます。実際、あなたの例では、Fixnumオブジェクトへの参照のコピーを値で渡しています。

コードの問題は、x += 1は渡されたFixnumオブジェクトを変更しませんが、代わりに完全に新しく独立したオブジェクトを作成します。

JavaプログラマーはFixnumオブジェクト不変を呼び出すと思います。

19

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
11
muesan

次のトリックを試すことができます:

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'
6
Ivan Gusev

http://Ruby-doc.org/core-2.1.5/Fixnum.html

Fixnumオブジェクトには即時の価値があります。つまり、パラメータとして割り当てられたり渡されたりすると、そのオブジェクトへの参照ではなく、実際のオブジェクトが渡されます。

また Rubyは値渡しです

2
Sam Liao

ただし、ハッシュなどの複合オブジェクトは参照によって渡されるようです。

fp = {}
def changeit(par)
  par[:abc] = 'cde'
end

changeit(fp)

p fp

与える

{:abc=>"cde"}
0
Ivan Cenov