2011-03-08 257 views
52

我想要一個方法每5分鐘執行一次,我實現了紅寶石(cron)。但它不起作用。我認爲我的方法無法訪問。 我想要執行的方法位於一個類中。我想我必須使這種方法是靜態的,所以我可以通過MyClass.MyMethod訪問它。但是我找不到正確的語法,或者我正在尋找錯誤的地方。紅寶石軌道 - 靜態方法

Schedule.rb

every 5.minutes do 
    runner "Ping.checkPings" 
end 

Ping.rb

def checkPings  
    gate = Net::Ping::External.new("10.10.1.1") 
    @monitor_ping = Ping.new() 

    if gate.ping?   
    MonitorPing.WAN = true 
    else 
    MonitorPing.WAN = false 
    end 

    @monitor_ping.save  
end 

回答

86

要聲明一個靜態方法,寫...

def self.checkPings 
    # A static method 
end 

......或者......

class Myclass extend self 

    def checkPings 
    # Its static method 
    end 

end 
+7

我不能再現後一個例子,'def checkPings extend self'。這是有效的語法? –

+1

你的課必須擴展自我才能使所有的方法在課堂上保持靜止。 – Ashish

56

您可以使用Ruby的靜態方法是這樣的:

class MyModel 
    def self.do_something 
     puts "this is a static method" 
    end 
end 
MyModel.do_something # => "this is a static method" 
MyModel::do_something # => "this is a static method" 

還注意到,您使用的是錯誤的命名約定爲你的方法。它應該是check_pings,但是這不會影響您的代碼是否工作,它只是ruby樣式。

+2

Thx爲答案和提示! (y) – Nostrodamus

+0

+1的用法 – dopplesoldner

+0

您應該按照建議更改您的方法的名稱 - 當您稍後回顧此代碼時,這很重要。而且這對於那些還必須閱讀代碼的人來說很重要 - 通常要弄清楚(任何)代碼不起作用(誰習慣了常規風格 - 這是我認識的每個人都在用Ruby編程的人)。 –

13

class MyModel 
    def checkPings 
    end 
end 

更改代碼

class MyModel 
    def self.checkPings 
    end 
end 

注有自加入方法名。

def checkPings是類MyModel的實例方法,而def self.checkPings是類方法。

-14

Ruby中不能有靜態方法。在Ruby中,所有方法都是動態的。 Ruby中只有一種方法:動態實例方法。

真的,術語靜態方法無論如何是一個誤用。靜態方法是一種不與任何對象關聯的方法,它不是動態分配的(因此是「靜態的」),但這兩者幾乎都是「方法」的含義。我們已經有了一個完美的名字爲這個結構:程序

+23

downvote;語義。 Ruby的方法可能不是「靜態的」,但OP只是需要一個類級別的函數(例如MyClass :: doThing()),這在ruby中是完全可行的。 「你不能用紅寶石做到這一點」沒有幫助。 – Doug

+7

超級無用的答案。 – andy

+0

正確,但對「方法」一詞超級挑剔。你知道他們的意思。 – byxor

4

而不是擴展整個類的self,您可以創建一個從自我延伸並定義您的靜態方法的塊。

,你會做這樣的事情:

class << self 
#define static methods here 
end 
在你的榜樣

所以,你會做這樣的事情:

class Ping 
    class << self 
    def checkPings 
     #do you ping code here 
     # checkPings is a static method 
    end 
    end 
end 

,你可以按如下稱之爲:Ping.checkPings