是否可以在给定于define_method的块中生成yield关键字?简单的例子:
class Test
define_method :test do |&b|
puts b # => #<Proc:...>
yield
end
end
Test.new.test {
puts "Hi!"
}
Run Code Online (Sandbox Code Playgroud)
此代码在Ruby 1.8.7和1.9.0中都会产生以下错误:
test.rb:4:在`test'中:没有来自test.rb的块(LocalJumpError):8
奇怪的是b块变量!= nil
但block_given?
返回false.有意的Ruby行为是不是通过Proc对象识别块?
编辑:关于Beerlington的回答:b.call()
不是我想要的.块变量仅用于指示实际给出块,并且在define_method中未检测到.
yield
而不是用的原因block.call
我愿意为Ruby中定义新类的方式编写一些扩展,因此当我使用我的扩展时,你可以接受任何可以用纯Ruby编写的代码.
因此,不能考虑类似的语义,因为这会强制我的库的用户只使用一种正确的方法来传递一个块.这会破坏TIMTOWTDI规则,并且不会使我的库透明.
以下代码可以简化为上面的代码,因为my_def
用途define_method
:
require 'my_library'
class Test
# client can write 'my_def' instead of 'def' since
# my_library extends Class class
my_def :test, "some parameter" do
yield # …
Run Code Online (Sandbox Code Playgroud) 我想要做的是强制一些任意的JavaScript代码在DOM元素"内部"执行,例如<div>
.换句话说,是否有可能使一段代码"思考" <div>
作为文档层次结构(或<body>
文档)的根源?
真人生活的例子:
假设我们有一个允许执行JavaScript代码的页面:
<!DOCTYPE html>
<html>
<head>
<title>Executor</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<div></div>
<input/>
<button onclick="$('div').html(eval($('input').val()))">
Execute
</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
代码可以访问整个文档并可以修改它,例如:
$("input").hide()
Run Code Online (Sandbox Code Playgroud)
会阻止我再编写任何愚蠢的代码;-)
是否可以限制某些JavaScript代码的效果区域?以及如果可能的话怎么做?
最好的祝福.
编辑:
我想要执行的代码可能就是一切.如果您的解决方案基于对给定代码的某种修改,请描述如何以正确的方式执行此操作.
EDIT2:
首先,我不知道为什么我会投票.
其次,我将执行的代码是别人的任意代码,而不是我的代码.
为了使一切清楚:
我真正想做的是以某种方式模拟浏览器.获取某些网页的内容,并插入我的网页.当我们决定关闭JavaScript并删除可能出现的所有地方时,这相对容易,但这是我不能做的事情.现在我想限制DOM修改(恶意代码).当我有一个基本想法时,我将在稍后处理重定向和cookie.
是否可以使用变量长度的参数列表定义函数?
我知道我可以写:
function() -> function([]).
function(X) when not is_list(X) -> function([X]);
function(X) -> do_something_with_arguments(X).
Run Code Online (Sandbox Code Playgroud)
但我想避免这种技术.
问题是默认用户模型没有给字段提供一些非常有用的选项,例如unique = True到电子邮件字段.
我读到了这个问题:覆盖默认的用户模型方法,并检查了代理模型概念,但没有效果.
起初我尝试过:
from django.contrib.auth import models
class User(models.User):
class Meta:
proxy = True
email = EmailField('e-mail address', unique=True, blank=False)
Run Code Online (Sandbox Code Playgroud)
结果导致:
django.core.exceptions.FieldError: Proxy model 'User' contains model fields.
Run Code Online (Sandbox Code Playgroud)
接下来是:
from django.contrib.auth import models
class User(models.User):
class Meta:
proxy = True
models.User.email = EmailField('e-mail address', unique=True, blank=False)
Run Code Online (Sandbox Code Playgroud)
而这个"解决方案"根本没有效果.默认用户模型的行为与以前相同.
我只对非猴子修补解决方案感兴趣.
编辑:好的.猴子修补对我来说是可以接受的,但是如何合理地做到这一点呢?(我的意思是不更改位于的文件/usr/pyshared/python2.6/...
)
我发现了以下问题: Java中的$ 0(程序名)?发现主要课程? 但接受的答案在这种情况下失败了:
public class Derived extends Base { }
class Base {
public static void main(String[] args){
System.out.println(getTheClassName());
}
static String getTheClassName(){
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
StackTraceElement main = stack[stack.length - 1];
return main.getClassName();
}
}
Run Code Online (Sandbox Code Playgroud)
致电时:
java Derived
Run Code Online (Sandbox Code Playgroud)
遗憾的是,输出Base
并不Derived
像预期的那样.
是否有可能获得真正的主类名称?(btw.jps
工具正确检测主类,但要获得正确的名称,我需要知道当前VM的ID,这也是一个问题)
最好的祝福.
编辑:确切地说:我需要知道作为传递给JVM的命令行参数传递的类的名称是什么.jps
工具按我想要的方式进行,但由于其他问题(例如未知的VMid),我无法使用此工具.
Edit2:全球回复Thorbjørn的回答:
对于您的工作方法,您需要使用非静态方法.使它成为非静态的,在Derived中有一个main()做一个新的Derived().getTheClassName()
我想知道我可以在Derived类中实现main方法而得到名称.
解决方案:我将提供(Thorbjørn和erickson的)初始化Derived
类的机制;-)所有答案都非常有用.我接受托尔比约恩的becase的他张贴了他的答案早于埃里克森.谢谢.