无法使用快捷方式调用方法

时间:2013-11-04 17:21:06

标签: ruby

我有一个模块,用于定义在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)

无法弄清楚出了什么问题。

3 个答案:

答案 0 :(得分: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")
根据{{​​1}}的方法定义,

l = Htmllog.add无效。所以你得到了错误。

答案 1 :(得分:1)

如果您希望l全局可用,则应将其定义为Kernel上的方法。

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

l "Hello world!", "h1"

小心不要与现有方法发生冲突。

答案 2 :(得分:0)

1当ruby看到l = Htmllog.add时,它将首先运行Htmllog.add而不带参数,然后将结果提供给变量l。这就是你有这个错误的原因。

2你能做到的一种方法是使用匿名函数:

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