当我运行以下代码时:
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
当我在puts
将return
更改为GermanShepard
时。它给出了:
Max goes Loud Bark
我不明白班上两个命令之间的区别。
答案 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
实际上做了两件事。
puts
方法(向终端屏幕显示Loud Bark
)nil
值返回给方法调用者。您可以尝试运行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}"
可分为几个步骤
name
方法return
ed转换为最接近的string
表示形式(在这种情况下,我们不需要执行任何操作,因为name
已经是string
)< / LI>
此时,我们的临时变量是Max goes
。
bark
方法puts "Loud Bark"
方法中调用了bark
行。puts
方法返回nil
值,bark
方法也会return
nil
值,因为它是最后一行bark
方法。 (阅读上面的“表达”)nil
转换为最接近的string
表示形式(即“”)临时变量现在是Max goes
现在,临时变量传递到puts
方法,终端(控制台)显示“Max goes”
程序完成
因此,您的示例打印出来
Loud Bark
Max goes
但是,如果我们将puts
方法中的bark
更改为return
,
第6步不会发生
它将return
nil
来return
"Load bark"
,而不是"Loud bark"
在步骤7中string
值
由于Max goes Loud bark
已经{{1}}值,因此不会发生第8步
并且步骤9之后的临时值将变为{{1}}
希望这有帮助!
答案 1 :(得分:1)
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)
有两件事需要考虑。
使用您的代码,
中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"