0
class Test
  def initialize
    @foo = 1
    @bar = 1
  end
  def change(a, b) 
    a += 1
    b -= 1   
  end 
  def print
    change(@foo,@bar)
    puts "#{@foo},#{@bar}"
  end
end

変数foobarはこのクラスで何度も一緒に変更される可能性があるため、1 つのメソッドを使用してこの作業を行うことができるかどうか疑問に思っていました。上記のコードを取得しながら2,0、メソッドで印刷したい。Rubyでそのようなメソッドを書く簡単な方法はありますか?print1,1

4

3 に答える 3

0

Rubyは実際にこれを行うことができますが、あなたが思っているほど明確ではありません. Ruby では、すべての変数は単なるオブジェクトへの参照です。そう:

2.0.0p0 :001 > def m(a)
2.0.0p0 :002?>   a << 1
2.0.0p0 :003?>   a
2.0.0p0 :004?> end
 => nil
2.0.0p0 :005 > a = [3,2]
 => [3, 2]
2.0.0p0 :006 > m(a)
 => [3, 2, 1]
2.0.0p0 :007 > a
 => [3, 2, 1]

ただし、整数は不変です。したがって、整数変数で同じことを行うことはできません。ほら、+=、-=、*= などはすべて本当にただのvar = var +/-/* rhs. これは、渡された変数ではなく、ローカル変数に格納されている参照のみを変更します。実際には 2 つのオプションがあります。

  1. 変更可能なオブジェクトを使用する: ハッシュ、配列などを使用します。また<<flatten!、 などの破壊的な操作を使用してください。
  2. シンプルで変更可能なオブジェクトで Integer をラップする: これを可能にする変更可能なラッパー クラスを記述します。
于 2013-03-10T14:23:39.617 に答える
0

このようなものは機能しますか?

class Test
  def initialize
    @foo = 1
    @bar = 1
  end
  def change(a, b) 
    a += 1
    b -= 1
    [a, b]   
  end 
  def print
    @foo, @bar = change(@foo,@bar)
    puts "#{@foo},#{@bar}"
  end
end

Ruby でこのようなことを行うこともできますが、参照渡しが組み込まれていないため、より高度です。

ソースコードを理解するのがさらに難しくなります。意図しない副作用で。

于 2013-03-10T12:31:33.890 に答える
0

整数は Ruby の不変オブジェクトであるため、そのように変更することはできません。a += 1ローカル変数aに新しい値を再割り当てするだけで、元のオブジェクトは変更されません (1)。

あなたが望むものを達成するために(あなたが望むものを実際に説明していませんが)、いくつかの可能性があります:

  • 整数をオブジェクトにラップします (これは、このような簡単な例では面倒です)。

  • ハッシュなどの整数ではなく、変更可能なオブジェクトを使用します。

例えば:

class Test
  def initialize
    @foo_bar = { foo: 1, bar: 1 }
  end
  def change(a, b) 
    @foo_bar[a] += 1
    @foo_bar[b] -= 1
  end 
  def print
    change(:foo,:bar)
    puts "#{@foo_bar[:foo]},#{@foo_bar[:bar]}"
  end
end

また、備考: オブジェクトのインスタンス変数をパラメーターとして同じオブジェクトのメソッドに渡す必要があることは非常にまれです (change(@foo,@bar)あなたの例では)。インスタンス変数は、オブジェクトの内部状態を保持するためのものです。

于 2013-03-10T12:38:59.450 に答える