2009-12-05 6 views
1

je recherche autour et essayé le mot-clé remplaçant « pour » mais je ne trouve rien. J'essaie quelque chose comme ça:Remplacement du mot clé "for" dans Ruby. C'est possible?

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

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

Qu'est-ce que vous essayez d'accomplir avec cela? Comment voulez-vous changer le comportement de 'for'? –

+0

Je suis juste expérimenté avec la structure interne de la langue –

+0

Il y a des mots-clés raison sont appelés mots-clés. Mais vous pouvez toujours obtenir la source Ruby et redéfinir le fonctionnement de 'for', ou l'appeler autrement, puis recompiler Ruby. – Zano

Répondre

6

Vous ne pouvez pas remplacer le mot-clé lui-même, mais une chose que vous pouvez faire est de dire ce que for fait pour vos propres classes. for appelle each interne, de sorte que l'astuce suivante fonctionnera:

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

Je ne pense pas que « majeur » un mot-clé est une option à ne importe quelle langue, vous pouvez remplacer les méthodes et les opérateurs (opérateurs eux-mêmes méthodes dans les langues modernes) seulement, for est un mot clé dans Ruby. Cependant, vous pouvez toujours faire des choses comme ce qui suit:

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

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

le code que vous avez écrit a des erreurs –

+0

hell ya ... désolé je redited le post entier ... – khelll

1

Si vous donnez la méthode un récepteur explicite cela fonctionnerait, mais vous ne seriez pas en mesure d'utiliser la méthode sans mettre explicitement l'auto devant lui.

Cela fonctionnerait:

def self.for(arg) 
    arg + 1 
end 

self.for(1) 
=> 2 

OU

class Aa 
    def c 
    self.for(1) 
    end 

    def for(arg) 
    arg + 1 
    end 
end 

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

MAIS, je suis d'accord avec Khell et certains des commentaires ci-dessus que les mots-clés réinventons est un énorme non non, bien sûr, si nous » re juste expérimenter et s'amuser, alors allez-y!