加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

了解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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读