我有一个模块,用于定义在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)
无法弄清楚出了什么问题。
答案 0 :(得分:4)
使用Object#method
和Method#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) }