0

私はいくつかのルビーコードを見てきましたが、変数や定数のようにメソッドを扱う人がいることに気づきました。

class Test

   def welcome_message
      "Hello World"
   end

   def greet_user
      p welcome_message
   end
end

次に、このTestクラスを継承する新しいクラスを作成しますが、その動作を変更します。

class New_Test < Test

   # changing the welcome message
   def welcome_message
      "Greetings"
   end
end

このようなことをするのに適切な時期はいつですか?値を返す前にもっと複雑な計算を実行できるので、より柔軟なコードを書くことができるように見えますが、上記の2つのテストクラスのようなコードを書くことを正当化する方法を思い付くことができません。

4

3 に答える 3

1

機能する理由

Ruby では、すべてのメソッドが値を返します。与えられた例でp welcome_messageは、Ruby に #welcome_message の戻り値の文字列表現を出力するように依頼しています。(技術的にはobject.inspectを標準出力に書き出しますが、ここでは同じことになります。)

「Hello World」が文字列以外のオブジェクトである場合でも、結果は同様です。たとえば、#welcome_method が文字列ではなく Fixnum を返した場合でも、文字列を出力しているように見えます。

戻り値

メッセージをクラス変数またはインスタンス変数に格納するか、オブジェクトでゲッター メソッドまたはセッター メソッドを使用することができます。ただし、中間ストレージに変数を使用するよりも、戻り値を式で直接使用する方が単純に便利な場合があります。

次のように変数を保存してから逆参照する代わりに、次のようにします。

def welcome_message
  @message = "Hello World"
end

def greet_user
  p @message
end

welcome_message # store the variable
greet_user      # dereference then print the variable

#welcome_message からの戻り値を直接使用できます。

これは、元の質問のような不自然な例ではあまり重要ではありませんが、大規模なアプリケーションでは時間、労力、またはメモリを節約できます。そうでない場合でも、中間変数はバグやプログラマー エラーの原因となる可能性があり、多くの場合、値を直接使用する方が意味的に明確です。

これは限られた例には当てはまりませんが、オブジェクトのパブリック インターフェイスを使用して情報を要求することをお勧めします。そのような場合、値を返すメソッドは不可欠です。

Ruby は直交言語ではありません。通常、何かを行うための有効な方法は複数あります。最終的には、コードで表現しようとしているもののセマンティクスについてです。

于 2012-07-15T06:12:44.457 に答える
0

メソッドはメソッドであり、変数や定数ではありません。

   def greet_user
      p welcome_message
   end

()省略可能ですので、以下と同じです。

   def greet_user
      p welcome_message()
   end

   def welcome_message
      "Greetings"
   end

return省略可能ですので、以下と同じです。

   def welcome_message
      return "Greetings"
   end
于 2012-07-15T05:41:37.093 に答える
0

クラスのインスタンスにパブリックな定数値が必要な場合はどうしますか? あなたはこれを行うことができます...

def initialize
  @welcome_message = "Greetings"
end
attr_reader :welcome_message

しかし、それはインスタンス変数を宣言していますが、その値は決して変化せず、すべてのインスタンスで同じになるため、適切ではないようです。

WELCOME_MESSAGE = "Greetings"
def welcome_message
  self.class::WELCOME_MESSAGE
end

その方が適切に思えますが、ちょっとばかげていると思いませんか? 定数を宣言しますが、実際には でのみ使用されwelcome_messageます。醜いを使用するために他に何も必要はありませんself.class::WELCOME_MESSAGE。真ん中の人を切り取ってみませんか?したがって:

def welcome_message
  "Greetings"
end
于 2012-07-15T06:18:57.430 に答える