-2

Ruby/Rails 関数内の変数を調整しようとしています。他の多くの言語の標準的なもの。

c:

void change(int *io){
  *io = 1;
}

これで、Ruby が参照渡し (スマイリー フェイス)であることがわかりました。このコードは完璧に動作します:

def tester()
  value = 'dave'
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 'test'  
end

出力は「テスト」です。

問題は、固定数には置換メソッドがないことです。それらは他の値と同じ方法で渡されません。

私の質問は、Rubyで「int」を「io」にするにはどうすればよいですか?

def tester()
  value = 10
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 15  
end

どちらが発生します

10:Fixnum の未定義のメソッド「replace」

4

3 に答える 3

5

@Linuxios は、値渡しに関する彼の説明では正しいですが、彼の回避策はかなり厄介です。置換をサポートするSimpleDelegatorを使用して fixnum をボックス化するのは非常に簡単です。

class NumberBox < SimpleDelegator
  alias_method :replace, :__setobj__
  class <<self; alias_method :[], :new; end
end

def tester()
  value = NumberBox[10]
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 15  
end

上記valueでは、デリゲート先のオブジェクトとまったく同じように動作し、初期化時に (::newまたは を使用して) 確立されますが、新しいオブジェクトをデリゲートとしてバインドするメソッドとそのエイリアスNumberBox::[]もサポートします。__setobj__replace

于 2013-03-12T00:54:01.367 に答える
2

これを行うには、実際には 2 つの方法があります。

  1. オブジェクトをラップする
  2. 配列でラップする
  3. mutable-int プロキシ オブジェクトを作成する

オプション 2 は簡単なので、例を挙げません。オプション 1 は次のようになります。

class IntRef < BasicObject
  def initialize(i)
    @int = i
  end
  def replace(v)
    @int = v
  end
  def method_missing(name, *args, &block)
    @int.send(name, *args, &block)
  end
end

またはオプション 3: プロキシ オブジェクト!

class MutableInt < BasicObject
  def initialize(i)
    @int = i
  end
  def method_missing(name, *args, &block)
    v = @int.send(name, *args, &block)
    if(v.is_a?(::Fixnum))
      @int = v
      return self
    end
    v
  end
end

警告:このプロキシに対して何かを行う、オブジェクトがくっついて変更されます。注意してください。

于 2013-03-12T00:03:16.187 に答える
0

Ruby が参照渡しであることは周知のとおりです。

それに対して、Ruby は値渡しのみです。参照渡しはありません。Java、Python などと同じです。

于 2013-03-12T07:16:26.920 に答える