質問

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"}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top