覆盖Ruby中的“for”关键字。可能吗?

时间:2009-12-05 12:10:50

标签: ruby metaprogramming override

我搜索并尝试覆盖“for”关键字,但我什么也没找到。 我正在尝试这样的事情:

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我不认为'覆盖'关键字是任何语言的选项,你可以只覆盖方法和运算符(运算符本身就是现代语言中的方法),for是Ruby中的关键字。但是,您仍然可以执行以下操作:

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

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

答案 2 :(得分:1)

如果你给这个方法一个明确的接收器它会起作用,但你不能在没有明确地将self放在它之前的情况下使用该方法。

这样可行:

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和上面的一些评论,重新定义关键字是一个巨大的不,当然,如果我们只是尝试和玩乐,那就去吧!