了解Ruby中的范围
发布时间:2020-12-17 02:46:05 所属栏目:百科 来源:网络整理
导读:我试图处理 Ruby中非常奇怪(至少对我而言)的情况.我的代码如下: class ScopeTest attr_accessor :flag def flagtest puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s if flag == 1 flag = 0 puts "SELF: " + self.flag.to_s puts "INST: " + fla
我试图处理
Ruby中非常奇怪(至少对我而言)的情况.我的代码如下:
class ScopeTest attr_accessor :flag def flagtest puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s if flag == 1 flag = 0 puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s self.flag = 0 puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s flagtest else puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s end end end st = ScopeTest.new st.flag = 1 st.flagtest 输出如下: SELF: 1 INST: 1 SELF: 1 INST: 0 SELF: 0 INST: 0 SELF: 0 INST: 0 SELF: 0 INST: 奇怪的是,标志变量在我最后一次打印时是否为nil(在else中),但在此之前为0(在flagtest方法中为if … else之前)? 当我删除几行代码时,一切似乎恢复正常,如下面的代码: class ScopeTest attr_accessor :flag def flagtest puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s if flag == 1 self.flag = 0 puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s flagtest else puts "SELF: " + self.flag.to_s puts "INST: " + flag.to_s end end end st = ScopeTest.new st.flag = 1 st.flagtest 给出以下输出: SELF: 1 INST: 1 SELF: 0 INST: 0 SELF: 0 INST: 0 SELF: 0 INST: 0 关于什么和为什么发生的任何线索? 解决方法
flag = 0创建一个名为flag的局部变量,其范围到达方法的末尾.在该赋值之后以词法形式出现的标志的任何使用都指向局部变量.任何先前的外观(以及self.flag的任何外观)都指的是getter方法.
所以else中的标志指的是局部变量.由于局部变量从未在else分支中获得值,因此其值为nil. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |