码迷,mamicode.com
首页 > 其他好文 > 详细

Ruby黑魔法, 在不使用全局变量的情况下, 在方法作用域里修改局部变量的值

时间:2020-06-01 21:07:40      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:位置   bind   全局   bin   文件   sel   魔法   作用域   cal   

举个栗子, 在文件作用域中定义两个变量, 然后直接在函数里修改它们的值, 之后再在文件作用域输出看看变量的值是否被改变:

a = 4
b = 7
self.print(a.object_id(), " ", b.object_id(), "\n")
def cha()
  a = 8
  b = 9
  self.print(a.object_id(), " ", b.object_id(), "\n")
end
cha()
self.print(a, " ", b, "\n")

console输出(每次运行都有可能不一样):

9 15
17 19
4 7

当a和b的被赋值成8和9之后, 他们的对象id已经变了, 说明a和b指向了8和9这两个新的Number对象, 所以回到文件作用域后a和b的值并没有改变.
解决办法一般是把文件作用域的a和b改成全局变量@a和@b, 不过还有一种办法是使用binding, 把对象的上下文保留在代码中的某个特定的位置, 供将来使用.

a = 4
b = 7
def cha(binding)
  binding.local_variable_set(:a, 6)
  binding.local_variable_set(:b, 8)
end
cha(binding)
self.print(a, " ", b, "\n")

console标准输出:

$ 6 8

Ruby黑魔法, 在不使用全局变量的情况下, 在方法作用域里修改局部变量的值

标签:位置   bind   全局   bin   文件   sel   魔法   作用域   cal   

原文地址:https://www.cnblogs.com/charleswbarkley/p/13027107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!