导入到本地范围

时间:2012-07-03 16:32:55

标签: ruby

考虑

# 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调用者的范围内,所以当不再引用时,它们还会被垃圾收集?

1 个答案:

答案 0 :(得分:2)

首先,独立(在main对象上调用)方法调用将导致NameError异常(如果它不存在)。只有在对象上调用方法时,才会得到NoMethodError

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

这是因为当您在nothing上调用main时,它不知道它是方法还是变量。但是:

nothing() #=> NoMethodError

因为()它现在知道它是你试图调用的方法。需要注意的事项。

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

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

greeting("Chell") #=> "Hello, Chell"
undef greeting
greeting("Chell") #=> NoMethodError