質問

それを忘れて何回か噛まれました x = y Ruby では、x は y と同じオブジェクトを参照します。私は、Ruby 用語で言うと、次のような言語に慣れすぎています。 x = y.dup. 。それを忘れて うっかり着替えてしまう y 課題の右側が安全だと思うとき。

単純なものを避けるのが理にかなっていることはわかります x = y 特別な理由のない割り当てですが、同じことが他の場所にも潜んでいる可能性があります。

name = (person.last_name.blank? ? 'unknown' : person.last_name)

後でどこに name << title 実際には名前だけでなく person.last_name も変更されます。

あなたも同じようなことが起こった場合、それを避ける方法をどのように学びましたか?注意すべき特定の危険信号やパターンはありますか?あなたは自分が課すそれぞれの任務を疑いの目で見ていますか?使いますか .dup たくさん?Ruby の使用法が私にとって自然になるかどうかはわかりません。そのため、役立つヒントがあれば大歓迎です。

役に立ちましたか?

解決

これはRubyのような(本質的に必須の)言語では不適合な声に聞こえるかもしれませんが、私のアドバイスは次のとおりです。代わりに新しいものを作成してください。あなたは少しパフォーマンスを支払いますが、より鮮明で、よりコンパクトで、よりモジュール式でデバッグがより簡単で簡単なコードを取得します。

http://en.wikipedia.org/wiki/functional_programming

だから、あなたの例では新しい名前を持つ新しい文字列を作成するだけです。

complete_name = name + title
.

他のヒント

toklandの回答への追加です:

機能的アプローチが主張するのは、 不変性 - つまり既存のオブジェクトを変更するのではなく、元のオブジェクトを変更したいときにいつでも別のオブジェクトを作成します。これは、Ruby がもたらすオブジェクト指向のパラダイム (オブジェクトは内部的にその状態を保持し、その状態はオブジェクトのメソッドを呼び出すことで変更できます) にやや反するので、2 つのアプローチの間で少しバランスを取る必要があります (一方で、私たちは利点を得ることができます)単一言語で複数のパラダイムに簡単にアクセスできるようにすることによって)。

したがって、今のところ覚えておくべきことは次の 3 つです。

  1. Ruby の代入とは何かを学びましょう。オブジェクトに名前を付ける以外の何ものでもありません。それで、あなたが言うとき y=x, 、「別の名前を付けます」と言っているだけです y 名前が付けられたものは何でも x".
  2. name << title 変異する オブジェクトと呼ばれる name.
  3. name += title という名前のオブジェクトを受け取ります name そして title, 、それらを連結します 別の オブジェクトを作成し、その新しいオブジェクト名を割り当てます name. 。それは何も変異させません。

私はそのような状況にまたがっていて、それは私が把握するために半分の日かけたバグをもたらしました。私は本質的にこのようなものをしました

hash = {....}
filename = object.file_name
hash.each |k, v| {file_name.gsub!(k, v) if file_name.include? k}
.

このコードはループ内にあり、ループ内で、変数file_nameが再度元の値に設定されていました。しかし、私はfile_name.gsub!を実行していたので、Object.File_nameが変更されました。これを解決するための2つの方法があります。.gsub!呼び出しをfile_name = file_name.gsubまたはfile_name = object.file_name.dupに置き換えます。私は2番目のオプションを選びました。

私たちは、特にこのような割り当て後に、それらが行動しているオリジナルのオブジェクトを変更するため、!<<を持つメソッドに注意してください。

メソッドは、その定義が変更されると言うことがない限り、変数(シフト演算子を使用することによって)を変更しないでください。

SO:(a)を作成しなかったメソッドまたは(b)文書を変更していないメソッドでオブジェクトを変更しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top