我希望能够实现像ruby那样的所有优秀插件,以便你可以这样做:
acts_as_commentable
has_attached_file :avatar
Run Code Online (Sandbox Code Playgroud)
但我有一个约束:
该辅助方法只能包含一个模块; 它无法定义任何变量或方法.
这样做的原因是,我希望选项哈希定义类似的东西type,并且可以将其转换为20个不同的"主力"模块中的一个,所有这些我可以在这样的行中总结:
def dynamic_method(options = {})
include ("My::Helpers::#{options[:type].to_s.camelize}").constantize(options)
end
Run Code Online (Sandbox Code Playgroud)
那些'workhorses'会处理选项,做的事情如下:
has_many "#{options[:something]}"
Run Code Online (Sandbox Code Playgroud)
这是结构的样子,我想知道你是否知道拼图中缺失的部分:
# 1 - The workhorse, encapsuling all dynamic variables
module My::Module
def self.included(base)
base.extend ClassMethods
base.class_eval do
include InstanceMethods
end
end
module InstanceMethods
self.instance_eval %Q?
def #{options[:my_method]}
"world!"
end
?
end
module ClassMethods
end
end
# 2 - all this does is define that helper method
module HelperModule
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def dynamic_method(options = {})
# …Run Code Online (Sandbox Code Playgroud) 在clojure 1.2RC1中,我希望获得一个基于其名称为字符串的函数并对其进行评估.
功能定义
(ns my-ns)
(defn mycar [x] (first x))
Run Code Online (Sandbox Code Playgroud)
以下工作:
((ns-resolve *ns* (symbol "mycar")) '(3 4))
((intern *ns* (symbol "mycar")) '(3 4))
((eval (symbol "mycar")) '(3 4))
Run Code Online (Sandbox Code Playgroud)
但他们看起来很难看.有没有更好的办法?如果没有,上面哪个是最惯用的?
我在ItemTemplate中有一个带有HyperLink控件的列表视图.如果返回值为0(false),我想显示链接,如果是1(true)则不显示链接.
到目前为止我有这个:
<asp:HyperLink runat="server" ID="lnkReview"
NavigateUrl='<%# Eval("EnquiryID", @"selectcompany.aspx?enq={0}")%>'
Text="Review Enquiry"
Visible='<%# ((bool)Eval("Locked"))==true? false : true %>' />
Run Code Online (Sandbox Code Playgroud)
...但这会导致"指定的强制转换无效"异常.
我在其他地方看到的例子,这应该有效.我可以确认Locked列只返回0或1(来自SQL Server) - 当然这些应该很容易从bit/int转换为bool?
我已经看到很多关于如何动态添加代码的建议(来源):
var myScript = document.createElement("script");
myScript.setAttribute("type","text/javascript");
myScript.innerHTML += 'alert("Hello");';
document.body.appendChild(myScript);
Run Code Online (Sandbox Code Playgroud)
而不是eval像现在这样
eval('alert("Hello");');
Run Code Online (Sandbox Code Playgroud)
人们抱怨性能下降和安全问题eval,但我无法想象添加<script>标签会更快或更安全.
编辑人想知道为什么我evaling微不足道的东西alert("Hello"),这是为什么:
我有一个数据库,比方说,1,000,000,000,000个脚本= P显然我不能加载每一个,而是用户可以加载任何他们想要的.脚本存储在服务器端的arbritrary位置.目前我通过其脚本名称请求(xmlhttprequest解释为javascript)脚本,服务器将以某种方式找到它并将其作为文本返回,立即执行/解释.我想知道将脚本作为文本返回是否更好,然后从中创建一个<script>标记.
此外,这不是eval()和附加脚本标记之间的Javascript差异的重复,它处理功能差异,这里我想要性能和安全性差异.
替代函数以R树的形式创建一个可以解析的语言对象.如何使用列表从头开始创建树,否则将其提供给eval?
# substitute gives a tree representation of the expression
a=1; b=2;
e1 = substitute(a+2*b)
eval(e1) #gives 5 as expected
e1 # is type language
e1[[1]] # this is `+`
e1[[2]] # this is 'a' type symbol
e1[[3]] # this is type language
e1[[3]][[1]] # this is `*` etc....
Run Code Online (Sandbox Code Playgroud)
我想知道如何以e1编程方式重建对象.理想情况下,我创建了一个复杂列表的对象,其中包含正确的对象,也许我会as.language在list对象上调用一些对象.然而,这不起作用.例如:
# how to construct the tree?
eval(list(as.symbol('+'),1,1)) # does not return 2
eval(as.expression(list(as.symbol('+'),1,1))) # does not return 2
Run Code Online (Sandbox Code Playgroud)
一种方法是生成字符串'1 + 1'然后解析它,但是当你首先拥有树时,生成字符串以再次解析它们似乎并不优雅!
eval(parse(text='1+1')) …Run Code Online (Sandbox Code Playgroud) 我最近从GNU make文档中找到了这段代码,它引用了eval函数.我真的很喜欢它,但是当我尝试在我的机器上测试它(make 3.81/Debian)时,它所做的只是尝试链接服务器而不首先编译c文件...为什么?make 3.81不兼容吗?
壳牌产量:
$ make
cc -o server
cc: no input files
Run Code Online (Sandbox Code Playgroud)
码:
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
# Everything after this is generic
.PHONY: all
all: $(PROGRAMS)
define PROGRAM_template =
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o $@
clean:
rm -f $(ALL_OBJS) $(PROGRAMS)
Run Code Online (Sandbox Code Playgroud) 如果将变量作为全局变量或本地变量传递给Python的函数eval(),为什么会有所不同?
正如文档中所描述的__builtins__,如果没有明确给出,Python将复制到全局变量.但也必须有一些我看不到的其他差异.
请考虑以下示例函数.它需要一个字符串code并返回一个函数对象.不允许内置(例如abs()),但math包中的所有功能.
def make_fn(code):
import math
ALLOWED_LOCALS = {v:getattr(math, v)
for v in filter(lambda x: not x.startswith('_'), dir(math))
}
return eval('lambda x: %s' % code, {'__builtins__': None}, ALLOWED_LOCALS)
Run Code Online (Sandbox Code Playgroud)
它按预期工作,不使用任何本地或全局对象:
fn = make_fn('x + 3')
fn(5) # outputs 8
Run Code Online (Sandbox Code Playgroud)
但它无法使用这些math功能:
fn = make_fn('cos(x)')
fn(5)
Run Code Online (Sandbox Code Playgroud)
这会输出以下异常:
<string> in <lambda>(x)
NameError: global name 'cos' is not defined
Run Code Online (Sandbox Code Playgroud)
但是当传递与globals相同的映射时,它可以工作:
def make_fn(code):
import math
ALLOWED = {v:getattr(math, v)
for …Run Code Online (Sandbox Code Playgroud) 为什么str(list)返回我们在控制台上看到列表的方式?str(list)工作怎么样?(对CPython代码的任何引用str(list))?
>>> x = ['abc', 'def', 'ghi']
>>> str(x)
"['abc', 'def', 'ghi']"
Run Code Online (Sandbox Code Playgroud)
要获得原始列表,str(list)我必须:
>>> from ast import literal_eval
>>> x = ['abc', 'def', 'ghi']
>>> str(x)
"['abc', 'def', 'ghi']"
>>> list(str(x))
['[', "'", 'a', 'b', 'c', "'", ',', ' ', "'", 'd', 'e', 'f', "'", ',', ' ', "'", 'g', 'h', 'i', "'", ']']
>>> literal_eval(str(x))
['abc', 'def', 'ghi']
Run Code Online (Sandbox Code Playgroud)
为什么不list(str(list))转动str(list)回原来的名单?
或者我可以使用:
>>> eval(str(x))
['abc', 'def', 'ghi']
Run Code Online (Sandbox Code Playgroud)
是literal_eval …
如果替换是在变量中传递的,那么第一个和第二个替换是否相等?
#!/usr/bin/env perl6
use v6;
my $foo = 'switch';
my $t1 = my $t2 = my $t3 = my $t4 = 'this has a $foo in it';
my $replace = prompt( ':' ); # $0
$t1.=subst( / ( \$ \w+ ) /, $replace );
$t2.=subst( / ( \$ \w+ ) /, { $replace } );
$t3.=subst( / ( \$ \w+ ) /, { $replace.EVAL } );
$t4.=subst( / ( \$ \w+ ) /, { ( $replace.EVAL ).EVAL } );
say …Run Code Online (Sandbox Code Playgroud)