让方法别名起作用
Getting Method Alias to Work
我正在尝试 'borrow' 来自 Ruby Commander Gem 的一些代码。在自述文件的示例中,它们显示了您在程序中放置的许多方法调用,如下所示:
require 'commander/import'
program :name, 'Foo Bar'
方法程序在Commander模块中,Runnerclass。如果您点击 require 链接,您将进入以下模块:
module Commander
module Delegates
%w(
add_command
command
program
run!
global_option
alias_command
default_command
always_trace!
never_trace!
).each do |meth|
eval <<-END, binding, __FILE__, __LINE__
def #{meth}(*args, &block)
::Commander::Runner.instance.#{meth}(*args, &block)
end
END
end
def defined_commands(*args, &block)
::Commander::Runner.instance.commands(*args, &block)
end
end
end
在指挥官模块中,Runner class,这是相关代码:
def self.instance
@singleton ||= new
end
def program(key, *args, &block)
if key == :help && !args.empty?
@program[:help] ||= {}
@program[:help][args.first] = args.at(1)
elsif key == :help_formatter && !args.empty?
@program[key] = (@help_formatter_aliases[args.first] || args.first)
elsif block
@program[key] = block
else
unless args.empty?
@program[key] = (args.count == 1 && args[0]) || args
end
@program[key]
end
end
我已将此代码复制到我自己的程序中,但它似乎无法正常工作,因为我在程序中遇到找不到方法的错误。如果我将 Runner 实例化为 runner 并调用 runner.program,它工作正常。
在我的版本中,所有内容都在一个文件中,我有
module Repel
class Runner
# the same methods as above
end
module Delegates
def program(*args, &block)
::Repel::Runner.instance.program(*args, &block)
end
end
end
module Anthematic
include Repel
include Repel::Delegates
#runner = Runner.new
#runner.program :name, 'Anthematic'
program :name, 'Anthematic'
...
end
我得到的错误是:
: undefined method `program' for Anthematic:Module (NoMethodError)
注释掉的代码在取消注释时有效。
如何让代码工作,或者有更好的方法吗?我不知道 eval 语句的其余部分发生了什么。我知道程序 def 中的参数数量已关闭。我对另一种对齐的方法有同样的问题。
我正在尝试 'borrow' 来自 Ruby Commander Gem 的一些代码。在自述文件的示例中,它们显示了您在程序中放置的许多方法调用,如下所示:
require 'commander/import'
program :name, 'Foo Bar'
方法程序在Commander模块中,Runnerclass。如果您点击 require 链接,您将进入以下模块:
module Commander
module Delegates
%w(
add_command
command
program
run!
global_option
alias_command
default_command
always_trace!
never_trace!
).each do |meth|
eval <<-END, binding, __FILE__, __LINE__
def #{meth}(*args, &block)
::Commander::Runner.instance.#{meth}(*args, &block)
end
END
end
def defined_commands(*args, &block)
::Commander::Runner.instance.commands(*args, &block)
end
end
end
在指挥官模块中,Runner class,这是相关代码:
def self.instance
@singleton ||= new
end
def program(key, *args, &block)
if key == :help && !args.empty?
@program[:help] ||= {}
@program[:help][args.first] = args.at(1)
elsif key == :help_formatter && !args.empty?
@program[key] = (@help_formatter_aliases[args.first] || args.first)
elsif block
@program[key] = block
else
unless args.empty?
@program[key] = (args.count == 1 && args[0]) || args
end
@program[key]
end
end
我已将此代码复制到我自己的程序中,但它似乎无法正常工作,因为我在程序中遇到找不到方法的错误。如果我将 Runner 实例化为 runner 并调用 runner.program,它工作正常。
在我的版本中,所有内容都在一个文件中,我有
module Repel
class Runner
# the same methods as above
end
module Delegates
def program(*args, &block)
::Repel::Runner.instance.program(*args, &block)
end
end
end
module Anthematic
include Repel
include Repel::Delegates
#runner = Runner.new
#runner.program :name, 'Anthematic'
program :name, 'Anthematic'
...
end
我得到的错误是:
: undefined method `program' for Anthematic:Module (NoMethodError)
注释掉的代码在取消注释时有效。
如何让代码工作,或者有更好的方法吗?我不知道 eval 语句的其余部分发生了什么。我知道程序 def 中的参数数量已关闭。我对另一种对齐的方法有同样的问题。