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

因为()它现在知道它是您尝试调用的方法。只是需要注意的事情。

其次,如果您希望一种方法有效然后无效,请使用undef.

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

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