为什么Ruby在string之前打印object.method?

时间:2016-03-08 16:34:36

标签: ruby methods

class Bike
  attr_accessor :color, :gear_numbers, :style

  def spin
    puts " spins! Woosh!"
  end
end

gw = Bike.new
gw.color = "white"
gw.gear_numbers = 11
gw.style = "compact"

puts "This bike is #{gw.color} and it has #{gw.gear_numbers} gears. Oh, and it has a #{gw.style} design. Did I mention that my bike #{gw.spin}?"

使用IRB,这就是我得到的:

**spins! Woosh!                                                                                                                 
This bike is white and it has 11 gears. Oh, and it                                                                             
has a compact design. Did I mention that my bike ?**  

为什么“旋转!Woosh!”在字符串之前出现,为什么不是 IN 字符串?

3 个答案:

答案 0 :(得分:4)

由于您未从方法中返回字符串,因此您需要直接打印它。

要执行您想要执行的操作,只需从puts方法中移除spin,即可开始使用。

class Bike
  attr_accessor :color, :gear_numbers, :style

  def spin
    "spins! Woosh!"
  end
end

答案 1 :(得分:2)

因为要插入字符串Ruby需要调用spin。然后Ruby包含spin方法的返回值(nil,因为puts返回nil)到字符串中并打印生成的字符串。

答案 2 :(得分:1)

这里的问题是字符串插值需要在字符串传递到您所在的主puts之前完全完成。作为弄清楚其中的内容的一部分,它必须执行它们出现的顺序中引用的每个方法。

您的spin方法导致立即 puts并且它不会返回任何内容,因为puts的工作方式如何。如果你想提供一个字符串,只需留下它:

def spin
  " spins! Woosh!"
end

想想这个字符串插值:

"a #{b} c #{d} e"

这大致相当于:

"a " + b.to_s + " c " + d.to_s + " e"

这些.to_s调用将强制转换为字符串。您希望在返回整个字符串之前执行bd

在预测代码将执行时,首先将执行跟踪到底部,然后再进行备份。简单的程序以非常可预测的方式工作。