2013-11-04 50 views
1

我有一個模塊,它定義了一個方法來記錄html文件中的某些輸出。該模塊是這樣的:使用快捷方式無法調用方法

module Htmllog 
    @htmllogfile = "htmllog/myproject" + Time.now.strftime('%Y%m%d-%H%M%S') + '.html' 

    def self.add(text, tag) 
    if tag.length == 0 
     formattedlog = text 
    else 
     formattedlog = "<#{tag}>#{text}</#{tag}>" 
     puts text 
    end 
    File.open(@htmllogfile, "a") do |f| 
     f.puts formattedlog 
    end 
    end 
end 

我把它在我的main.rb的文件,如果我這樣稱呼它只是正常工作:

Htmllog.add "Hello world!", "h1" 

因爲我要記錄的東西很多,我想添加一個快捷方式來減少位數,我試過這個:

l = Htmllog.add 
l "Hello world!", "h1" 

但是我得到這個錯誤。

`add': wrong number of arguments (0 for 2) (ArgumentError) 

無法弄清楚什麼是錯的。

+1

你'l = Htmllog.add'正在等待參數:) – Gerep

回答

4

做如下使用Object#methodMethod#call

l = Htmllog.method(:add) 
l.call("Hello world!", "h1") 
l.("Hello world!", "h1") # which is same l.call("Hello world!", "h1") 

l = Htmllog.add不是爲每add的你的方法定義有效。所以你有錯誤。

+0

如果你希望它更短,你可以'l [']而不是'l.call(...)'。 Ruby不允許在變量中引用方法,可能是因爲它可能會導致語法歧義,因爲可以調用一個沒有paranthesis的方法。 – Danyel

+0

@Danyel'l。(...)'也可以工作.. :) –

0

1當ruby看到l = Htmllog.add時,它將首先運行Htmllog.add而沒有參數,然後將結果提供給變量l。這就是爲什麼你有這個錯誤。你可以做到這一點

2的一種方法是使用匿名函數:如果你想l可以全局

l = ->(text, tag) { Htmllog.add(text, tag) } 
1

,那麼你就應該定義爲在Kernel的方法。

module Kernel 
    def l *args; Htmllog.add(*args) end 
end 

l "Hello world!", "h1" 

小心不要與現有方法發生衝突。