加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 寒冷魔王 于 2015-10-16 13:38 编辑
我有两个用法相同的函数:
def range1(n) n.times { |i| yield(i) } end def range2(n) n.times { |i| yield(n-i-1) } end
def range1(n)
n.times { |i| yield(i) }
end
def range2(n)
n.times { |i| yield(n-i-1) }
end
这两个函数都可以通过
rangeN(n) { |i| print(i) }
来调用,具有一致性。
我想通过使用一个函数does,实现上述模板。
比如这种方式
does({range1(10)}) # 此为理想状态,不正确
does({range2(10)}) # 此为理想状态,不正确
如下我做了一番尝试:
def do1(proc) proc.call { |i| print(i) } end def do2(&block) block.call.call { |i| print(i) } end def do3(*args) print(*args) end def do4(sym) #eval(sym + "{ |i| print(i) }") # ! Error! end n = 10 range1(n) { |i| print(i) } puts puts("1.1:") do1( ->(&block) { range1(n) { |i| block.call(i) } } ) puts puts("1.2:") do1( Proc.new { |&block| range1(n) { |i| block.call(i) } } ) puts puts("2:") do2 { ->(&block) { range1(n) { |i| block.call(i) } } } puts puts("3:") range1(n) { |*args| do3(*args) } puts puts("4:") do4("range1(n)") # ! Error!
def do1(proc)
proc.call { |i| print(i) }
end
def do2(&block)
block.call.call { |i| print(i) }
end
def do3(*args)
print(*args)
end
def do4(sym)
#eval(sym + "{ |i| print(i) }") # ! Error!
end
n = 10
range1(n) { |i| print(i) }
puts
puts("1.1:")
do1( ->(&block) { range1(n) { |i| block.call(i) } } )
puts
puts("1.2:")
do1( Proc.new { |&block| range1(n) { |i| block.call(i) } } )
puts
puts("2:")
do2 { ->(&block) { range1(n) { |i| block.call(i) } } }
puts
puts("3:")
range1(n) { |*args| do3(*args) }
puts
puts("4:")
do4("range1(n)") # ! Error!
有没有更为简便的写法呢?
===============
感谢@喵呜喵5 大触的答案,已经成功实现does:
def does(method_name,*args) send(method_name,*args) { |i| print(i) } end does(:range1,10) puts does(:range2,10) puts
def does(method_name,*args)
send(method_name,*args) { |i| print(i) }
end
does(:range1,10)
puts
does(:range2,10)
puts
|