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

时间:2012-07-15 05:37:56

标签: ruby variables methods constants

我一直在查看一些ruby代码,并注意到有些人会对变量或常量等方法进行处理。

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

何时适合做这样的事情?它似乎允许你编写更灵活的代码,因为我可以在返回值之前执行更复杂的计算,但是我无法想出一种方法来证明编写一段代码就像上面的两个Test类一样。

3 个答案:

答案 0 :(得分:1)

为什么会起作用

在Ruby中,每个方法都返回一个值。在您给出的p welcome_message示例中,您要求Ruby打印#welcome_message返回值的字符串表示形式。 (从技术上讲,它是将 object.inspect 写入标准输出,但这里的内容相同。)

如果“Hello World”是String之外的其他对象,结果仍然类似。例如,如果#welcome_method返回了Fixnum而不是String,那么它仍然会显示以打印字符串。

返回值

您可以将消息存储在类或实例变量中,或者在对象上使用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_message的返回值。

在原始问题中的设计示例中,这不太重要,但它可以在较大的应用程序中节省时间,精力或内存。即使不是,中间变量也可能是错误或程序员错误的来源,而且通常只是在语义上更清晰才能直接使用这些值。

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

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

答案 1 :(得分: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

答案 2 :(得分: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