2012-07-03 114 views
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_loadgreeting("abc")調用成功,但後者greeting("Adrian")導致NoMethodError;但puts s.bright?調用成功。

因此,從綜合的角度來說:這樣來自sun.rb的類,方法在my_load的調用者的範圍內,並且它們在不再被引用時會額外獲取垃圾回收?

+0

這是行不通的。方法和類從未被垃圾收集。假設他們將通過他們最有可能的整個計劃被需要。 – Linuxios

+0

@Linuxios:類是彼此相似的對象。如果沒有對它們的引用,它們就會像其他所有對象一樣收集垃圾。方法本身並不是對象,因此,「垃圾收集」這些概念沒有意義,但它們存儲在類(或模塊)中,所以當包含模塊進行垃圾回收時,它們的內存將被釋放。 –

+0

@JörgWMittag:是的,但只要一個類被它的「名稱」(引用它的常量)引用,它就會存在。分配一個常量是不好的形式,並引發一個警告(這應該很快會變成一個錯誤)。所以一個常數所指的類可以通過良好的形式被認爲是永久性的。這並沒有改變這樣的事實,即任何實施這種做法的東西最多都是黑客。也許我會試試! :)。 – Linuxios

回答

2

首先,一個獨立的(在main對象上調用的)方法調用將導致NameError異常(如果它不存在)。只有在對象上調用該方法時,纔會得到NoMethodError

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

這是因爲當你在mainnothing,它不知道,如果它是一個方法或變量。但是:

nothing() #=> NoMethodError 

因爲使用()它現在知道它是您嘗試呼叫的方法。只是要注意的東西。

二,如果你想要一個方法工作,然後不工作,使用undef

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

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