2013-08-21 59 views
0

我有這樣的:如何調用另一個Ruby腳本中的方法?

module CommonMethods 

    def createLog() 
    $log = Logger.new(logPath) 
    puts "Doesn't seem to fire..." 
    $log.level=Logger::INFO 
    return $log 
    end 
在shared.rb

我試圖從另一個腳本調用它,但最終還是需要從多個腳本調用它,就像這樣:

require_relative "shared" 
include CommonMethods 
CommonMethods.createLog 

,但它似乎並沒有被真正做任何事情。

我試圖創建$log作爲局部變量,並作爲一個全局變量,但不是「返回」它。我嘗試了所有我能想到的(我來自C#背景),但我無法做到。

在這個例子中,我試圖調用外部方法來創建「日誌」,然後我可以在本地使用它。我將與其他許多方法一樣,但直到我可以使方法調用正確爲止。

有人可以幫忙嗎?

+0

請刪除標題和文字主觀和/或個人表達。 – sawa

+0

如果你指的是我的投注,我很久沒有測試了。當我認爲事情沒有解除時,我加了一句,而且偷了,他們沒有。 – mikecole79

+0

你真的看到了什麼結果?一個錯誤,或者只是沒有輸出?雖然有幾件事情需要修復或解釋,但你所擁有的代碼實際上應該工作(只要'logPath'被定義在某處)。 – matt

回答

1

模塊是專爲組織方法和將竭誠爲包括在內。如果你包含一個模塊,你不再需要命名空間。

require_relative "shared" 
include CommonMethods 
createLog # Call it simply 
+0

假裝我很愚蠢(有些日子比其他人多),並讓我看到可以使這項工作的另一半代碼。我之前嘗試過使用「模塊」,這就是最初查詢的原因。我在定義腳本中爲「Class」切換了「Module」,現在它正在工作(感謝您的評論以上是「self」),但是如果我嘗試包含該類,它會告訴我這是錯誤的參數類型。如果我想作爲一個模塊來完成,我需要做一個類,然後在類中添加模塊以使其以這種方式工作? – mikecole79

+0

@ mikecole79,類將被啓動,但不包括在內。像'foo = Foo.new',你也可以調用上面提到的screenmutt之類的方法。模塊可以包含在我的答案中,並且這些方法也可以用'self'直接調用。另外我不明白你爲什麼在變量中使用'$',這是很少使用的全局變量。我建議你停下來工作一段時間,並首先閱讀一些基本的書:) –

+0

不是一個壞建議。這個全局變量是因爲我有問題來回傳遞控制,想要看看它是否是範圍問題還是其他工作中的時髦力量。我有幾本書選擇了我正在爲這個項目工作。謝謝大家對這個問題的幫助。我懷疑在經過一段時間的睡眠之後(希望在這個週末),有機會閱讀更多的內容將會開始變得更加重要。 – mikecole79

0

Ruby模塊必須包含在類中。見the documentation for Module

你最可能想要的是一堂課。

common_methods.rb:

class CommonMethods 
    def self.createLog() 
    $log = Logger.new(logPath) 
    puts "Doesn't seem to fire..." 
    $log.level=Logger::INFO 
    return $log 
    end 
end 

而在其他的文件:

require 'common_methods' 
CommonMethods.createLog 
+0

按照你的指示。仍然不想給我任何東西。我在類中添加了一個名爲testThis()的新方法,當我嘗試從另一個腳本中觸發該方法或原始方法時,我返回一個「未定義的方法」錯誤。 – mikecole79

+0

如果您調用'CommonMethods.createLog',則該方法必須是類方法而不是實例類。 'def self.createlog'。並且不需要支撐。 –

+0

這兩個帳戶都正確。 – screenmutt

0

這裏的問題是,你試圖調用createLog就像是一個類的方法,但實際上它不是。如果你想打電話給CommonMethods.createLog,你必須定義它這樣做createLog類方法:

module CommonMethods 
    def self.createLog() # Note that it's self.createLog 
    $log = Logger.new(logPath) 
    puts "Doesn't seem to fire..." 
    $log.level=Logger::INFO 
    return $log 
    end 
end 

然後調用它像這樣:

require 'common_methods' 
CommonMethods.createLog 

但如果,你想要include這個模塊在一個類中(這是什麼模塊通常用於),你必須將createLog作爲一個「實例方法」,然後包含模塊。

module CommonMethods 
    def createLog() 
    $log = Logger.new(logPath) 
    puts "Doesn't seem to fire..." 
    $log.level=Logger::INFO 
    return $log 
    end 
end 

然後你使用這樣的:

require 'common_methods' 

class SomeOtherClass 
    include CommonMethods # Include methods from CommonMethods 
end 

foo = SomeOtherClass.new 
foo.createLog # createLog is an instance method on 'foo' now 
相關問題