2015-01-04 8 views
5

Ich habe ein Array in Ruby, mit allen Schlüsselwörtern.Programmatische Möglichkeit, Ruby Schlüsselwörter zu erhalten

Zum Beispiel:

RUBY_KEYWORDS = %w(

    alias and BEGIN begin break case class def defined 
    do else elsif END end ensure false for if in module 
    next nil not or redo rescue retry return self super 
    then true undef unless until when while yield 

) 

Meine Frage ist einfach:

Gibt es eine eingebaute Möglichkeit, programmatisch auf alle Keywords zugreifen?

Einige meiner Projekte müssen eine Abfrage gegen Benutzereingabe, führen, und es ist ein bisschen ärgerlich, um das gleiche Array in all diese Projekte zu definieren.

+0

Welche Abfrage laufen Sie? Warum müssen Sie die Eingabe anhand dieser Keyword-Liste überprüfen? Validierst du die Eingabe? Was ist mit anderen Ruby-Methoden, die gefährlich sein könnten (z. B. FileUtils.rm_r)? – spickermann

+1

Ich vervollständige die vorherige Frage mit einem Zitat von Matz: "_Der Ruby-Parser ist flexibel und beschwert sich nicht, wenn Sie diesen Schlüsselwörtern Präfixe mit @, @@ oder $ voranstellen und sie als Instanz-, Klassen- oder globale Variablennamen verwenden. Die beste Vorgehensweise besteht darin, diese Schlüsselwörter als reserviert zu behandeln. " Wenn Sie der Meinung sind, dass Sie Eingaben mit diesen Schlüsselwörtern nicht akzeptieren sollten, könnte dies ein Fehler sein. Daher wiederhole ich die Frage: Warum brauchen Sie die Keyword-Liste? – romainsalles

Antwort

6

diesen Code Versuchen :)

RubyToken::TokenDefinitions.select { |definition| definition[1] == RubyToken::TkId } 
          .map { |definition| definition[2] } 
          .compact 
          .sort 

# returns : 
# ["BEGIN", "END", "__FILE__", "__LINE__", "alias", "and", "begin", "break", "case", "class", "def", "defined?", "do", "else", "elsif", "end", "ensure", "false", "for", "if", "in", "module", "next", "nil", "not", "or", "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", "until", "when", "while", "yield"] 
+1

Es ist interessant, dass die [Keyword-Tabelle in Ruby-Quelle] (https://github.com/ruby/ruby/blob/ruby_2_2/defs/keywords) "__ENCODING__" enthält. Dieser Code gibt alle außer diesem zurück. –

+1

Sie sollten wahrscheinlich erwähnen, dass dies ein Teil der 'irb'-Bibliothek in der stdlib ist, nicht die Core-Bibliothek, so dass Sie zuerst 'irb/ruby-token'requirieren müssen. Es ist auch bekannt, dass der Parser von IRb fehlerhaft ist, daher stimmen die Ergebnisse, die Sie hier erhalten, nicht unbedingt mit der Ruby-Spezifikation überein. Und es ist undokumentiert und kann sich ohne vorherige Ankündigung ändern. –

+0

Das scheint zu funktionieren, danke! Ich bleibe dabei, bis etwas Besseres kommt. :) – shevy

0

Ich glaube nicht, dass Sie können, da es im Parser definiert wird.

Eine gute Alternative wäre auf den Quellcode suchen: https://github.com/ruby/ruby/blob/ruby_2_1/defs/keywords

+0

Zunächst einmal: 'Object.methods' zeigt * nicht * die Methoden der' Object' Klasse, es zeigt die Methoden an, auf die das 'Object' * Objekt * antwortet, was im Grunde die Methoden der' Class' Klasse sind nicht die 'Object' Klasse, da' Object' eine Instanz von 'Class' ist. Was Sie wollen, ist 'Object.instance_methods'. Jedoch werden weder 'Object.instance_methods' noch' Object.constants' die Schlüsselwörter anzeigen. Es wird die Methoden und Konstanten zeigen (duh!) –

+0

Gut zu wissen, ich habe die Antwort bearbeitet. – Pran