如何让字符串插值中的局部变量无法被外部访问?
如何在Ruby字符串插值中隔离局部变量
嘿,这个问题我太懂了!Ruby的字符串插值里的花括号可不是真正的代码块,所以里面定义的局部变量会“跑出来”污染外部作用域,确实挺烦人的。不过我们有几个简单的办法能解决这个问题:
方法1:使用匿名Lambda(箭头函数)
Lambda会创建自己的局部作用域,里面的变量不会泄露到外部。我们可以定义一个匿名Lambda然后立即调用它:
s = "#{(-> { a = 2; b = 3; a * b }).call}" # 尝试访问外部的a会报错:undefined local variable or method `a' for main:Object
这里面的a和b完全是Lambda内部的局部变量,插值完成后就会被销毁,不会和外部的变量产生冲突。
方法2:使用Proc对象
和Lambda类似,我们也可以用Proc.new创建一个代码块,然后调用它:
s = "#{Proc.new { a = 2; b = 3; a * b }.call}"
同样,Proc内部的变量被严格隔离在自己的作用域里,外部访问不到。
为什么你之前的尝试失败了?
你之前写的两种方式都有语法或逻辑上的问题:
s = "#{{a = 2; b = 3; a * b}}":这里的{...}会被Ruby解析成哈希字面量,而不是代码块。赋值语句a=2不是有效的哈希键值对,所以会直接报错。s = "#{do a = 2; b = 3; a * b; end}":do...end是块语法,但#{}插值内部需要的是一个可求值的表达式,块不能直接作为表达式使用,所以这也是语法错误。
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

