【发布时间】:2018-05-24 03:27:12
【问题描述】:
在这段代码中:
s = "#{a = 2; b = 3; a * b}" # =>"6"
a # => "2"
局部变量a 和b 在字符串插值内创建,并且可以在字符串插值之外访问,因为字符串插值不是块,尽管有花括号。
我想在字符串插值中创建局部变量,这些变量仅在代码中需要,在其他地方不需要,在字符串插值完成后应将其删除,以尽量减少副作用和潜在的变量冲突。
我尝试制作一个代码块来实现变量的局部性,但没有成功:
s = "#{{a = 2; b = 3; a * b}}"
与do...end 相同。
s = "#{do a = 2; b = 3; a * b; end}"
【问题讨论】:
-
字符串插值的花括号--
{前面有一个井号--与块无关。 Matz 也可以将其定义如下:n = 3; "#|n|". -
你需要一个单独的作用域,比如使用一个方法或者过程。例如,您可以写成
s = ->{ "#{a = 2; b = 3; a * b}" }.call #=> "6"; a #=> NameError: undefined local variable or method 'a' for main:Object。 -
s = "#{->() { a = 2; b = 3; a * b }.()}" -
@CarySwoveland 你可能想把它们变成答案。
-
因此,此时的问题应该是,如果像命名函数/方法这样不那么神秘的东西可能不会对代码的任何未来读者(包括您自己)更有利。
标签: ruby local-variables string-interpolation