小编Daw*_*wid的帖子

在Ruby中使用yield_method中的yield

是否可以在给定于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块变量!= nilblock_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)

ruby metaprogramming

29
推荐指数
2
解决办法
5709
查看次数

是否可以"沙盒化"任意JavaScript只能在一个<div>而不是整个文档上运行?

我想要做的是强制一些任意的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.

javascript security

13
推荐指数
2
解决办法
921
查看次数

Erlang中函数参数列表的可变长度

是否可以使用变量长度的参数列表定义函数?

我知道我可以写:

function() -> function([]).
function(X) when not is_list(X) -> function([X]);
function(X) -> do_something_with_arguments(X).
Run Code Online (Sandbox Code Playgroud)

但我想避免这种技术.

erlang

8
推荐指数
2
解决办法
2809
查看次数

如何覆盖Django中的默认用户模型字段?

问题是默认用户模型没有给字段提供一些非常有用的选项,例如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/...)

django django-models

5
推荐指数
1
解决办法
8588
查看次数

"Java中的$ 0(程序名称)?发现主要课程?" 再次

我发现了以下问题: 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的他张贴了他的答案早于埃里克森.谢谢.

java command-line-arguments

2
推荐指数
1
解决办法
4380
查看次数