1

「値渡し」のメカニズムは、呼び出し先が元のデータを変更できないようにするためでした。したがって、呼び出し先は任意の方法でパラメーター変数を変更できますが、関数が戻ったときに、引数変数の元の値は変更されません。

ただし、Objective-CまたはRubyでは、オブジェクトのすべての変数がオブジェクトへの参照であるため、オブジェクトを任意のメソッドに渡すと、メソッドは「メッセージを送信」し​​てオブジェクトを変更できます。メソッドが戻った後、呼び出し元はすでに別の状態にある引数を続行します。

または、渡されたオブジェクトが変更されない(状態が変更されない)ことを保証する方法はありますか?そのようなメカニズムはありますか?

4

2 に答える 2

1

ここでは、「値渡し」と「参照渡し」という用語を誤用しています。あなたが本当に話しているのはですconstconstC ++では、可変クラスのインスタンスを参照できます。ObjCオブジェクトには同様の概念はありません(または、RubyではObjCよりもRubyに精通していませんが、私は信じています)。ObjCは、Cを介してconstポインターの概念を持っていますが、これらははるかに弱い約束です。

ObjCでこれを解決する最善の方法は、可能な限り値(不変)クラスを優先することです。詳細については、Objective-cのImutabilityを参照してください。

次善の解決策は、設計の問題として、この状況を回避することです。名前から明らかではないメソッドの副作用を避けてください。設計上の問題としてこれを回避することにより、発信者はそれについて心配する必要がなくなります。発信者と被呼者は同じチームに所属していることを忘れないでください。どちらも、他から自分自身を保護しようとしてはなりません。優れた命名と優れたAPI設計は、開発者がコンパイラを強制せずにエラーを回避するのに役立ちます。ObjCにはコンパイラの強制がほとんどないため、適切な命名と適切なAPI設計が絶対に重要です。Rubyについても同じことが言えますが、Rubyでの経験は限られていますが、Rubyは非常に動的な言語でもあります。

最後に、オブジェクトを変更すべきでないときに変更する動作の悪いAPIを扱っている場合は、オブジェクトを渡すことに頼ることができますcopy

ただし、これを最初から設計する場合は、可能な限り不変のクラスを使用することを検討してください。

于 2012-08-30T14:56:21.763 に答える
0

何をしているのかわかりません。Ruby値渡しです。「引数変数を変更」することはできません。

def is_ruby_pass_by_value?(foo)
  foo = 'No, Ruby is not pass-by-value.'
  return nil
end

bar = 'Yes, of course, Ruby *is* pass-by-value!'

is_ruby_pass_by_value?(bar)

p bar
# 'Yes, of course, Ruby *is* pass-by-value!'

Objective-Cについてはよくわかりませんが、それが違っていたら驚きます。

于 2012-08-30T14:43:22.547 に答える