0

検討

# sun.rb
class Sunshine
  def bright?
    return true
  end
end

def greeting(greeter)
  puts "hello, Sun from #{greeter}"
end


# main.rb
def abc
  my_load "sun.rb"
  greeting("abc")
  return Sunshine.new
end

s = abc
puts s.bright?
greeting("Adrian")
...

my_load呼び出しが成功するようなものをここに持つことはできますgreeting("abc")が、後者greeting("Adrian")は NoMethodError を引き起こします。しかし、puts s.bright?呼び出しは成功します。

つまり、総合的に言えば、sun.rb のクラス、メソッドが呼び出し元のスコープ内にあり、my_load参照されなくなったときにさらにガベージ コレクションを取得するようにするにはどうすればよいでしょうか?

4

1 に答える 1

2

まず、スタンドアロン (mainオブジェクトで呼び出される) メソッド呼び出しは、NameError存在しない場合に例外を引き起こします。NoMethodErrorオブジェクトでメソッドを呼び出した場合にのみ取得されます。

nothing #=> NameError
class A; end
A.nothing #=> NoMethodError

これは、nothingonを呼び出すときにmain、それがメソッドなのか変数なのかがわからないためです。でも:

nothing() #=> NoMethodError

を使用する()と、呼び出しようとしているメソッドであることがわかります。注意すべきことだけです。

第 2 に、メソッドを機能させてから機能させたくない場合は、 を使用しますundef

def greeting(name)
   puts "Hello, #{name}"
end

greeting("Chell") #=> "Hello, Chell"
undef greeting
greeting("Chell") #=> NoMethodError
于 2012-07-03T17:26:34.753 に答える