不得不说贵站管理员说话真有意思,标题求兼职,用换工作回答,并得出了找不到工作,以及自己的问题的滑坡结论。
重申:本人目前在职前端,零散时间教 Ruby。求兼职。
另外这个号才是本尊。(顺便反馈 github 关联账号似乎最近无法正常登陆)
有时候总觉得脆弱的身体支撑不住发散的精神
方法名和参数的话视你具体情况可以用自动推理,比如放在 method_missing 里面,然后参数如果是 Fixnum 就写一个 int,String 就写一个 char *,现场 attach_function
直线救国的话:
class B
def a
'b'
end
end
class A < B
def a
#do some stuff
super
end
end
因为有可能是在别的地方这么弄一下的话:
obj = A.new
B.instance_method(:a).bind(obj).call
可以用 Fiddle::Closure(ruby ~>2.0) 或者 ffi(rubygems) 的有关方法来把一个 lambda 变成一个函数指针类似的东西,比如假设这个方法叫做 foo,那么 foo{|a| p a }可以变成一个有函数指针的东西,效果是把传进去的第一个参数 p 出来,这是 CRuby 做 Callback 的一种方法,但是如果你想把这个 Callback 作为创建线程的参数,也就是可能有真多线程,可能会因为全局虚拟机锁 (GVML/GIL,目前版本的 CRuby) 导致奇怪的问题……
用了比较诡异的办法,自己造了作用域,但是肯定还有一些边角问题,勉强抛砖引玉吧
可以用下面的代码测试:
1.upto(10).with_control{|i|
eval("Control.next if i % 2 == 0")
p i
}
还有一个不成熟的标签,类似 Java 的 break label,这里预想也是支持 next 和 redo 的
1.upto(10).with_control{|i|
a = Control.label #获得标签,标签指向的是外层的with_control
1.upto(10).with_control{|j|
Control.break a if i > 3 && j > 3 #满足条件时,连外层一起break掉
p [i, j]
}
}
嗯,用 case 匹配的: 或者http://codepad.org/TES3Rb1Y
def matchlist(mdata, x, xs)
->list{
Array === list && ->list{
mdata[x], *mdata[xs] = list; mdata[x]
}.(list) ## 木有 >>=要手动传递真不爽……
}
end
def reverse list, mdata = {}; case list
when [] then []
when matchlist(mdata, :x, :xs) then reverse(mdata[:xs]) << mdata[:x]
end;end
p reverse [1,2,3,4,5]
#2 楼 @iBachue local_variables 的取法才 evil…… 单纯 global_variables 还好…… (不过也没有检测变量名)
def gv_get(a)
eval a.to_s
end
def gv_set(a, b)
eval "#{a}=b"
end
def lv_get(a, binding = nil, &block)
eval a.to_s, binding || block.binding
end
def lv_set(a, b, binding = nil, &block)
eval "#{a}=ObjectSpace._id2ref(#{b.object_id})", binding || block.binding
end
gv_set(:$a, 3)
gv_get(:$a)
a = 3
p lv_get(:a){}
lv_set(:a, 5){}
p a
r = lambda{
a = 3
b = 5
binding
}.call
p lv_get(:a, r) + lv_get(:b, r)
因为楼主的代码看起来也是在匿名 Module m 的上下文运行 yield 等价的东西……,但 yield 是和写块的位置绑定的,所以干脆手动制作一个上下文。。。除了闭包上下文还有 self 上下文呢,啊哈:(楼上 Fiber 的自动切换上下文很厉害的~)
def filter(name, &blk)
@__filters ||= []
@__filters << [name, blk]
end
def run_filters(&blk)
m = Module.new do
extend self
@__filter_endpoint = blk
def scope
Thread.current[:__myblock] ||= []
end
def go
scope[-1].call
end
private :scope, :go
end
code = '@__filter_endpoint.call'
@__filters.each do |name, block|
m.send(:define_method, :"__filter_#{name}"){|&b|
scope.push b
ret = instance_eval &block
scope.pop
ret
}
end
@__filters.each do |name, block|
code = "send(:\"__filter_#{name}\") { #{code} } "
end
m.module_eval code.tap {|c| puts c}
end
filter '1' do
puts 1
go
puts 1
end
filter '2' do
puts 2
go
puts 2
end
filter '3' do
puts 3
go
puts 3
end
run_filters do
puts 'core'
end
非要 Ruby 的话,干脆拿 Win32 SDK 函数写吧,加上 Ruby 本身能力可以和 VB6 很像……