用ruby写了个很像c里的for循环的东东
ruby吧
全部回复
仅看楼主
level 6
浮云半仙 楼主
module Kernel
def forfor(proc1,proc2,proc3) #实在想不出叫什么名字了就叫forfor了
proc1.call
loop do
proc3.call
break if (proc2.call) == false
yield if (proc2.call) == true
end
end
end
#例子 可以嵌套哟
$times = 0
forfor(Proc.new{$a = 0},Proc.new{$a < 5},Proc.new{$a += 1}) do
forfor(Proc.new{$b= 0},Proc.new{$b < 4},Proc.new{$b += 1}) do
$times += 1
end
end
p $times # 12
2014年04月20日 03点04分 1
level 6
浮云半仙 楼主
proc1
初始化数据
proc2
循环的条件,当proc2运算的结果为true时一直循环下去(执行block)
proc3
每执行完一次block进行的数据更新
proc1,proc2,proc3要是Proc对象
2014年04月20日 04点04分 2
level 8
那每次写for循环就敲比平时多的代码不累?
2014年04月20日 09点04分 3
level 6
浮云半仙 楼主
楼上的意思令人难以理解。。。
这个forfor 是仿C语言里的那个for循环写的
与ruby的for循环根本就没关系
2014年04月20日 09点04分 4
level 11
proc2执行了两次啊= =
           ——好疼好疼,虽然不会死但是会疼~
2014年04月20日 15点04分 5
既然要实现C语法不如实现goto←←
2014年04月20日 15点04分
没有啦。。。proc2结果为true是执行block,false是就break了,而且特意把break这句放在yield前面就是防止block多执行一次的。。。。。goto额
2014年04月21日 12点04分
proc2只是判断是否达到执行block的条件的语句啦,,,扔到if修饰符后面,真正要执行的是方法后的block
2014年04月21日 12点04分
回复 浮云半仙 :你那种写法proc2一定会执行两次,如果proc2有副作用,你这个就出错了
2014年04月21日 13点04分
level 6
浮云半仙 楼主
我还真写了个goto
module Kernel
def goto(str)
$goto = str
end
end
class Symbol
def come_here(str)
yield if str == $goto
end
end
goto("aaa")
:a.come_here("aaa") {print "I'm here"}
# I'm here
2014年04月21日 12点04分 6
你这功能不完全,往回跳怎么办?goto和come_here之间的代码还是执行了 不用元编程做出来的效果能看?
2014年04月21日 13点04分
功能确实不完全。。。能当case语句那种功能用,但要是在方法定义里写的就会往回跳
2014年04月21日 13点04分
level 11
不错。赞一个
2014年04月21日 15点04分 7
1