Переопределение ключевого слова for в Ruby. Является ли это возможным? - PullRequest
1 голос
/ 05 декабря 2009

Я искал и пытался переопределить ключевое слово "for", но ничего не нашел. Я пытаюсь что-то подобное:

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

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

Ответы [ 3 ]

6 голосов
/ 05 декабря 2009

Вы не можете переопределить само ключевое слово, но одну вещь, которую вы можете сделать, это сказать, что 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 голосов
/ 05 декабря 2009

Я не думаю, что «переопределение» ключевого слова является опцией на любом языке, вы можете переопределить только методы и операторы (сами операторы являются методами в современных языках), for - это ключевое слово в Ruby. Однако вы все еще можете делать что-то вроде следующего:

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

loop 1..6 do |x|
  #do something with x
end
1 голос
/ 05 декабря 2009

Если вы дадите методу явный получатель, он будет работать, но вы не сможете использовать метод без явного указания себя перед ним.

Это будет работать:

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 и некоторыми комментариями выше, что переопределение ключевых слов - это огромное нет, конечно, если мы просто экспериментируем и развлекаемся, тогда сделайте это!

...