2015-01-04 5 views
5

私はRubyですべてのキーワードを持つ配列を持っています。例えばRubyのキーワードを取得するためのプログラム的な方法

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 

) 

私の質問は簡単です:

は、プログラムですべてのキーワードをアクセスするための内蔵方法はありますか?

私のプロジェクトの中には、ユーザー入力に対して というクエリを実行する必要があります。 これらのプロジェクトで同じ配列を定義する必要があります。

+0

クエリのどのような種類を実行していますか?なぜあなたはこのキーワードのリストに対して入力をチェックする必要がありますか?あなたは入力を 'eval'しますか?危険な他のRubyメソッド(例えば 'FileUtils.rm_r')はどうですか? – spickermann

+1

私はMatzから引用して前の質問を完成させます: "_ Rubyパーサは柔軟性があり、これらのキーワードの前に@、@@、$接頭辞をつけてインスタンス、クラス、またはグローバル変数名として使用すると文句を言うことはありません。これらのキーワードを予約語として扱います。 "また、これらのキーワードで入力を受け入れるべきでないと思われる場合は、エラーになる可能性があります。したがって、私は質問を繰り返します:なぜあなたはキーワードリストが必要ですか? – romainsalles

答えて

6

は、このコードを試してみてください:)

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

[ruby sourceのキーワードテーブル](https://github.com/ruby/ruby/blob/ruby_2_2/defs/keywords)に '__ENCODING__'が含まれているのは興味深いことです。このコードは、それ以外のすべてを返します。 –

+1

これはstdlibの中の 'irb'ライブラリの一部であり、coreライブラリではないことに言及しておきましょう。まず' irb/ruby​​-token 'を 'require'する必要があります。また、IRbのパーサがバグであることはよく知られているので、ここで得られた結果は必ずしもRubyの仕様と一致するとは限りません。そして、それは文書化されていないので、予告なく変更することがあります。 –

+0

これはうまくいくようです、ありがとう!より良いものが出てくるまで、私はそれに固執するでしょう。 :) – shevy

0

パーサーで定義されているので、できないと思います。

あなたの代わりには、ソースコードを見て次のようになります。https://github.com/ruby/ruby/blob/ruby_2_1/defs/keywords

+0

まず、 'Object.methods'は' Object'クラスのメソッドを表示せず、 'Object' *オブジェクトが応答するメソッドを表示します。これは基本的に' Class'クラスのメソッドです'Object'は' Class'のインスタンスであるため、 'Object'クラスではありません。あなたが望むのは 'Object.instance_methods'です。しかし、 'Object.instance_methods'と' Object.constants'のどちらもキーワードを表示しません。それは方法と定数を表示しようとしています(おお!) –

+0

おかげで、私は答えを編集しました。 – Pran