Ruby 为什么这个示例将方法视为变量或常量?

Ruby 为什么这个示例将方法视为变量或常量?,ruby,variables,methods,constants,Ruby,Variables,Methods,Constants,我一直在看一些ruby代码,注意到有些人将方法视为变量或常量 class Test def welcome_message "Hello World" end def greet_user p welcome_message end end def greet_user p welcome_message end 然后,您可以编写一个从这个测试类继承的新类,但更改它的行为方式 class New_Test <

我一直在看一些ruby代码,注意到有些人将方法视为变量或常量

class Test

   def welcome_message
      "Hello World"
   end

   def greet_user
      p welcome_message
   end
end
   def greet_user
      p welcome_message
   end
然后,您可以编写一个从这个测试类继承的新类,但更改它的行为方式

class New_Test < Test

   # changing the welcome message
   def welcome_message
      "Greetings"
   end
end
class New_测试

什么时候做这样的事情合适?它似乎允许您编写更灵活的代码,因为我可以在返回值之前执行更复杂的计算,但我无法找到一种方法来证明编写上述两个测试类这样的代码的合理性。

方法是方法,而不是变量或常量

class Test

   def welcome_message
      "Hello World"
   end

   def greet_user
      p welcome_message
   end
end
   def greet_user
      p welcome_message
   end
与下面相同,因为可以省略
()

   def greet_user
      p welcome_message()
   end
   def welcome_message
      return "Greetings"
   end

与下面相同,因为可以省略
返回值

   def greet_user
      p welcome_message()
   end
   def welcome_message
      return "Greetings"
   end
为什么有效 在Ruby中,每个方法都返回一个值。在给定的
p welcome_message
示例中,您要求Ruby打印#welcome_message返回值的字符串表示形式。(从技术上讲,它是将object.inspect写入标准输出,但在这里也是一样的。)

如果“Hello World”是字符串以外的其他对象,则结果仍然类似。例如,如果#welcome_方法返回一个Fixnum而不是一个字符串,那么它看起来仍然是在打印一个字符串

返回值 您可以将消息存储在类或实例变量中,或者对对象使用getter或setter方法。但是,有时直接在表达式中使用返回值比使用变量进行中间存储更方便

而不是像这样存储然后取消引用变量:

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_消息的返回值

在像原始问题中那样的人为示例中,这不太重要,但在更大的应用程序中,它可以节省时间、精力或内存。即使没有,中间变量也可能是bug或程序员错误的来源,直接使用这些值通常在语义上更清晰

虽然这不适用于您的有限示例,但使用对象的公共接口来请求信息也是更好的做法。在这种情况下,返回值的方法至关重要


Ruby不是一种正交语言;做某事通常有不止一种有效的方法。最后,它是关于您试图在代码中表达的内容的语义。

当您想要一个类实例的公共常量值时,您会怎么做?你可以这样做

def initialize
  @welcome_message = "Greetings"
end
attr_reader :welcome_message
但这声明了一个实例变量,它似乎并不合适,因为它的值永远不会改变,并且对于所有实例都是相同的

WELCOME_MESSAGE = "Greetings"
def welcome_message
  self.class::WELCOME_MESSAGE
end
这似乎更合适。。。但这不是有点傻吗?我们声明了一个常量,但它实际上只在
欢迎消息中使用。使用丑陋的
self.class::WELCOME\u消息
,不需要其他任何东西。为什么不干脆去掉中间人呢?因此:

def welcome_message
  "Greetings"
end