29

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

6 に答える 6

32

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

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

a = 5
func(:a, binding)
puts a # => 6
于 2008-10-02T10:06:23.247 に答える
20

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

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

FixnumJava プログラマーはオブジェクトをimmutableと呼ぶと思います。

于 2008-10-02T10:00:40.033 に答える
12

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
于 2008-10-02T10:13:23.933 に答える
8

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

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'
于 2015-03-02T07:01:33.843 に答える
2

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

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

またRubyは値渡しです

于 2016-03-02T06:53:26.073 に答える