4

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: 

奇妙なのは、flag変数がnil最後に出力されたとき ( の内部else) であるが、0その直前 ( if...elseflagtest メソッドの前) であるということです。

数行のコードを削除すると、次のコードのようにすべてが正常に戻ったように見えます。

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

何が、なぜ起こっているのかについての手がかりはありますか?

4

3 に答える 3

2

flag = 0スコープがメソッドの最後にある flag というローカル変数を作成します。その使用はflag、その代入の後に字句的に現れ、ローカル変数を参照します。以前の出現 (および の出現self.flag) は、getter メソッドを参照します。

したがって、flagelseローカル変数を参照します。ローカル変数は - 分岐で値を取得していないためelse、その値はnilです。

于 2013-09-02T15:38:13.447 に答える