2009-12-05 47 views
1

我搜索周围,并试图覆盖“for”关键字,但我什么也没找到。 我想类似的东西:覆盖Ruby中的“for”关键字。可能吗?

def for("maybe_arguments_go_here") 
    print "Hello from function for!" 
end 

for i in 1..3 
    print "Hello from for" 
end 
+0

你想用这个完成什么?你想如何改变'for'的行为? – 2009-12-05 12:12:54

+0

我只是试验语言的内部结构 – 2009-12-05 12:15:55

+0

有一个原因关键字被称为关键字。但是你总是可以获得Ruby源代码并重新定义'for'的工作方式,或者将其称为别的东西,然后重新编译Ruby。 – Zano 2009-12-05 12:21:37

回答

6

你不能覆盖关键字本身,但你可以做的一件事是说for为你自​​己的类做了什么。 for在内部调用each,所以下面的技巧将起作用:

class MyFor 
    def initialize(iterable) 
    @iterable = iterable 
    end 

    def each 
    @iterable.each do |x| 
     puts "hello from for!" 
     yield x 
    end 
    end 
end 

# convenient constructor 
module Kernel 
    def my(x) 
    MyFor.new(x) 
    end 
end 

for i in my(1..3) 
    puts "my for yielded #{x}" 
end 
3

我不认为这是压倒一切“的关键词是任何语言选项,您可以覆盖的方法和运营商(运营商本身在现代语言的方法)只, for是Ruby中的关键字。但是你仍然可以做这样的事情如下:

def loop(range) 
    range.each{|i| yield i} 
end 

loop 1..6 do |x| 
    #do something with x 
end 
+0

你写的代码有错误 – 2009-12-05 12:39:12

+0

hell ya ...对不起,我重申了整个帖子...... – khelll 2009-12-05 13:35:21

1

如果你给的方法的显式接收器,将工作,但您将无法使用该方法没有明确地把自己之前。

这会工作:

def self.for(arg) 
    arg + 1 
end 

self.for(1) 
=> 2 

OR

class Aa 
    def c 
    self.for(1) 
    end 

    def for(arg) 
    arg + 1 
    end 
end 

b = Aa.new 
b.for(4) 
=> 5 

,但我同意khell有的上面重新定义的关键字的评论是一个巨大的,不,不,当然,如果我们”只是试验和乐趣,然后去做!