我有两个红宝石课程:
第一个包含一些我不允许修改的方法。 (这是一个IRB)
第二个包含一个方法“run_code”,它应该从第一个类调用方法 保存他们的输出。
如何在内核模块中包含第一类的方法?我想用Kernel.eval(“myMethod”)来评估函数,但它给了我“未定义的局部变量或方法`myMethod'for Kernel:Module”错误。
我的第二堂课看起来像这样
require 'stringio'
require 'irb'
class Engine
extend Shell
def initialize()
@binding = Kernel.binding
end
def run_code(code)
# run something
stdout_id = $stdout.to_i
$stdout = StringIO.new
cmd = <<-EOF
$SAFE = 3
$stdout = StringIO.new
begin
#{code}
end
EOF
begin
result = Thread.new { Kernel.eval(cmd, @binding) }.value
rescue SecurityError
return "illegal"
rescue Exception => e
return e
ensure
output = get_stdout
$stdout = IO.new(stdout_id)
end
return output
end
private
def get_stdout
raise TypeError, "$stdout is a #{$stdout.class}" unless $stdout.is_a? StringIO
$stdout.rewind
$stdout.read
end
end
我试过这样的事情
module Kernel
extend Shell
end
class Object
include Kernel
end
但它不起作用
Shell样本:
module Shell
@@commands = {}
def self.commands
@@commands
end
@@command_groups = {}
def self.command_groups
@@command_groups
end
class Shell
attr_accessor :hbase
attr_accessor :formatter
@debug = false
attr_accessor :debug
def initialize(hbase, formatter)
self.hbase = hbase
self.formatter = formatter
end
def hbase_admin
@hbase_admin ||= hbase.admin(formatter)
end
def hbase_table(name)
hbase.table(name, self)
end
def hbase_replication_admin
@hbase_replication_admin ||= hbase.replication_admin(formatter)
end
def hbase_security_admin
@hbase_security_admin ||= hbase.security_admin(formatter)
end
[other methods *]
end
我想要包含Shell类
中的方法