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)

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

4

3 回答 3

4

Object#method使用and执行以下操作Method#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。所以你有错误。

于 2013-11-04T17:23:49.127 回答
1

如果您想l在全球范围内可用,那么您应该将其定义为Kernel.

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

l "Hello world!", "h1"

注意不要与现有方法发生冲突。

于 2013-11-04T17:29:53.420 回答
0

1 当 ruby​​ 看到l = Htmllog.add时,它会先Htmllog.add不带参数运行,然后将结果提供给 variable l。这就是为什么你有这个错误。

2 一种方法是使用匿名函数:

l = ->(text, tag) { Htmllog.add(text, tag) }
于 2013-11-04T17:28:31.287 回答