Ruby:字符串插值在第二次调用时首先打印函数

Ruby: String interpolation prints the function first when called second

这是我的小程序

def def1()
  x = 1
  puts x
end

def def2()
  y = 2
  puts y
end

puts "some text #{def1}"
puts "some text #{def2}"

这个例子的结果...

1
some text 
2
some text

我不明白为什么要按这个顺序而不是 "sometext" 首先。

因为字符串是先创建的,也就是说调用def1,然后整个字符串传入puts.

我们可以展开puts "some text #{def1}"出来理解。

string = "some text " + def1.to_s
puts string

如您所见,调用了 def1 来创建字符串。 def1 打印出 1 本身,它不 return 任何东西(它 returns nil)。然后打印整个字符串。

这就是所有函数调用的工作方式。评估参数,调用函数。

您需要在打印前缀后调用 def1

print "some text "
def1

这就是为什么让一个函数 return 一个值比打印它本身更好的原因。

为了打印字符串,puts 必须知道字符串是什么。为了知道这个特定行中的字符串是什么:

puts "some text #{def1}"

Ruby 必须先调用 def1def1,依次调用 puts 打印一些东西。