`puts`和`return`之间的区别是什么?

时间:2016-01-02 21:37:57

标签: ruby

当我运行以下代码时:

class GermanShepard
  attr_accessor :name
  def bark
    puts "Loud Bark"
  end
end

max = GermanShepard.new
max.name = "Max"
puts "#{max.name} goes #{max.bark}"

结果是:

Loud Bark
Max goes 

当我在putsreturn更改为GermanShepard时。它给出了:

Max goes Loud Bark

我不明白班上两个命令之间的区别。

4 个答案:

答案 0 :(得分:4)

表达

在大多数语言中,方法中的return表示为调用者提供值。

在Ruby中,一切都是expression。从本质上讲,方法的最后一行是使用return自动调用的。例如,以下方法是等效的:

def bark_a
    'Woof!'
end

def bark_b
    return 'Woof!'
end

但是,某些方法可能不是return任何内容。

def bark_c
end

在这种情况下,ruby实际上返回了一个nil对象。

就是一个例子

puts方法。 puts方法只显示您提供的任何内容。

所以在你的例子中,

def bark
  puts "Loud Bark"
end

实际上做了两件事。

  1. 正在调用puts方法(向终端屏幕显示Loud Bark
  2. 然后它将nil值返回给方法调用者。
  3. 您可以尝试运行puts nil并查看打印出来的内容!

    “#{}”

    在ruby中调用#{}称为interpolation,它基本上将变量放在最接近的string表示值中。以下陈述大致相同:

    puts "One plus one equals #{1 + 1}"
    puts "One plus one equals " + (1 + 1).to_s
    

    你的例子

    通过上述所有信息,我们现在可以逐步完成您的示例。

    puts "#{max.name} goes #{max.bark}"可分为几个步骤

    1. 调用name方法
    2. 将值return ed转换为最接近的string表示形式(在这种情况下,我们不需要执行任何操作,因为name已经是string)< / LI>
    3. 然后将值保存到临时变量
    4. 此时,我们的临时变量是Max goes

      1. 调用bark方法
      2. 我们在puts "Loud Bark"方法中调用了bark行。
      3. 终端(控制台)显示“Loud Bark”
      4. 由于puts方法返回nil值,bark方法也会return nil值,因为它是最后一行bark方法。 (阅读上面的“表达”)
      5. 然后将
      6. nil转换为最接近的string表示形式(即“”)
      7. 然后将其保存为临时变量
      8. 临时变量现在是Max goes

        1. 现在,临时变量传递到puts方法,终端(控制台)显示“Max goes”

        2. 程序完成

        3. 因此,您的示例打印出来

          Loud Bark
          Max goes 
          

          但是,如果我们将puts方法中的bark更改为return

          第6步不会发生 它将return nilreturn "Load bark",而不是"Loud bark"在步骤7中string值 由于Max goes Loud bark已经{{1}}值,因此不会发生第8步 并且步骤9之后的临时值将变为{{1}}

          希望这有帮助!

答案 1 :(得分:1)

ruby中的

puts(string)将字符串值写入$stdout。例如,如果在终端中运行ruby console,则会将字符串写入终端。同时ruby中的每个方法都返回一些东西,方法puts返回nil。因此,当我们想要插入像“Hello#{some_method}”这样的字符串时,它会插入返回值some_method,如果puts它会插入nil值。

Loud Bark # output of max.bark method
Max goes # output of last puts 

答案 2 :(得分:1)

Ray的答案可能是正确的,但由于它太冗长(我甚至不想读它),我会发一个简明的答案。

有两件事需要考虑。

  1. 传递给方法的所有参数都在方法调用之前进行评估。
  2. Ruby中的所有方法都有一个返回值。另外,一些方法具有副作用,其示例是在终端上输出。在任何情况下,在方法完成所有副作用后返回值。
  3. 使用您的代码,

    puts的参数
    puts "#{max.name} goes #{max.bark}"
    
    首先评估

    。为此,max.bark(以及max.name之类的其他内容)必须提前进行评估。方法bark打印"Loud Bark",然后返回nil。所以上面提到的论点变为"#{"Max"} goes #{nil}",最终变为"Max goes "。这是在"Loud Bark"之后打印的。

    当您将方法中的puts更改为return时,方法bark将没有副作用,并返回"Loud Bark";这是return的功能(顺便说一下,return不是方法,而是关键字)。所以上面提到的论点变为"#{"Max"} goes #{"Loud Bark"}",最终变为"Max goes Loud Bark"。这将是唯一印刷的东西。

答案 3 :(得分:0)

puts "Loud Bark"   # => returns nil
return "Loud Bark" # => returns "Loud Bark"