我正在寻找将一些较轻的元编程从Nemerle转移到Boo,我试图找出如何定义自定义运算符.例如,我可以在Nemerle中执行以下操作:
macro @<-(func, v) {
<[ $func($v) ]>
}
Run Code Online (Sandbox Code Playgroud)
那么这两个是等价的:
foo <- 5;
foo(5);
Run Code Online (Sandbox Code Playgroud)
我无法在Boo中找到这样做的方法 - 任何想法?
我想下面的方法添加到Ruby on Rails的Math类:
class Math
def self.round_with_precision(number, precision)
scalar = 10.0 ** precision
number = number * scalar
number = number.round
number = number / scalar
return number;
end
end
Run Code Online (Sandbox Code Playgroud)
然后我将以下内容添加到我的environment.rb中:
require 'lib/math'
Run Code Online (Sandbox Code Playgroud)
当我打开Rails控制台时,我收到以下错误:'./ lib/math.rb:2:TypeError Math不是一个类'
好像我忽略了一些非常简单的事情.
有什么想法吗?
在此先感谢您的帮助.
我想做类似以下的事情:
class String
def fancy_thing appendix
# Just a trivial example to ensure self and params work.
# Pretend this is something complex.
self.reverse + appendix
end
end
# print_method on instance or class should spit out a string
# containing the actual code for that method
ft_code = "cob".print_method :fancy_thing
ft_code = String.print_instance_method :fancy_thing
# => "{|appendix| self.reverse + appendix }" *
# ft_code gets passed around a bit...
# exec on an object should run code (w/ parameters) …Run Code Online (Sandbox Code Playgroud) 我想要弄清楚的是,我在Groovy中看到的是否与ExpandoMetaClasses有某种等价.我一直在阅读有关Open Classes的内容,但我无法确定Ruby允许类修改的范围.
借用上面博客中的一个例子,在Groovy中,我可以修改Java的String类并向它添加一个方法,如下所示:
String.metaClass.shout = {->
return delegate.toUpperCase()
}
println "Hello MetaProgramming".shout()
// output
// HELLO METAPROGRAMMING
Run Code Online (Sandbox Code Playgroud)
而且我认为 Ruby会让你重新定义这个类并且可能是别名(请帮助澄清我此时的误解):
class String
def foo
"foo"
end
end
puts "".foo # prints "foo"
Run Code Online (Sandbox Code Playgroud)
在Groovy中,有一些方法可以将核心Java库方法重新定义为单个实例或使用Categories的一组实例,这些方法与我在Ruby中定义为mixins的方式类似.
将开放类的范围扩展到特定实例或模块子集的方法有哪些?
如果我要安装一个已重新定义某个核心类的gem,那么只会影响该模块,或者是否会将任何.rb文件包含在受该影响的gem中?
为Ruby和Groovy做出一些可能的假设提前道歉,我对两者都很新,但一直试图找到两者之间的等价.
我想在运行时向类定义添加一些方法.但是,在运行以下代码时,我得到一些令人惊讶的(对我而言)结果.
class klass(object):
pass
for i in [1,2]:
def f(self):
print(i)
setattr(klass, 'f' + str(i), f)
Run Code Online (Sandbox Code Playgroud)
在命令行上进行测试时,我得到以下信息:
>>> import test
>>> k = test.klass()
>>> k.f1()
2
>>> k.f2()
2
Run Code Online (Sandbox Code Playgroud)
为什么k.f1()返回2而不是1?这似乎与我相反.
该测试是在kubuntu机器上使用python3.0完成的.
lambda在本例中用于组合和水合物方法.lambda在这做什么?
def compose *lambdas
if lambdas.empty?
lambda { nil }
elsif lambdas.size == 1
lambdas.first
else
lambda do |n|
lambdas.first.call(compose(*lambdas[1..-1]).call(n))
end
end
end
def hydrate(modulus, printable_form)
i = 0
lambda do |n|
(i = (i + 1) % modulus) == 0 && printable_form || n
end
end
print(((1..100).map
&compose(
hydrate(15, 'Watermelon'),
hydrate(5, 'Melon'),
hydrate(3, 'Water'))).join(' '))
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是 - 在撰写单词前面的&符号需要什么?
为简单起见,假设我在Python中有一个Person类.该类包含firstname,lastname和dob的字段.
class Person:
def __init__(self, firstname, lastname, dob):
self.firstname = firstname;
self.lastname = lastname;
self.dob = dob;
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我想按姓氏排序人员列表,然后是firstname,后跟dob.在其他情况下,我想先用dob排序,然后用lastname排序,最后用firstname排序.有时我只想按名字排序.
创建第一个比较函数的天真解决方案是这样的:
def comparepeople(person1, person2):
if cmp(person1.lastname, person2.lastname) == 0:
if cmp(person1.firstname, person2.firstname) == 0:
return cmp(person1.dob, person2.dob);
return cmp(person1.firstname, person2.firstname);
return cmp(person1.lastname, person2.lastname);
Run Code Online (Sandbox Code Playgroud)
看起来应该有一种简单的方法来定义这样的比较函数,使用元编程方法,我需要做的就是按优先顺序提供字段名称,而不是编写这些非常冗长,丑陋的比较方法.但我最近才开始玩Python,并没有找到类似我所描述的内容.
所以问题是,对于具有多个可比构成成员的类,编写比较函数的最Pythonic方法是什么?
我对如何让这个工作感兴趣:
me = "this is a string"
class << me
alias :old<< :<<
def <<(text)
old<<(text)
puts "appended #{text}"
end
end
Run Code Online (Sandbox Code Playgroud)
我希望当某些内容被附加到me变量时,该对象将使用重新定义的方法.
如果我尝试运行它,我会syntax error, unexpected ':', expecting kEND接受:<<.
我有一个python模块.
我想在运行时为它填充一些值,我该怎么做.
例如.我有一个清单,
['A','B','C']
我正在创建具有这些名称的类,并希望它们可用,就像我正常创建它们一样
for el in ['A', 'B', 'C']:
type(el, (object,), {})
Run Code Online (Sandbox Code Playgroud) 我搜索并尝试覆盖"for"关键字,但我什么也没找到.我正在尝试这样的事情:
def for("maybe_arguments_go_here")
print "Hello from function for!"
end
for i in 1..3
print "Hello from for"
end
Run Code Online (Sandbox Code Playgroud) metaprogramming ×10
ruby ×6
python ×3
binding ×1
boo ×1
comparison ×1
exec ×1
groovy ×1
lambda ×1
macros ×1
module ×1
nemerle ×1
operators ×1
overriding ×1