2015-01-04 21 views
5

Tüm anahtar kelimelerle Ruby'de bir Array var. ÖrneğinRuby anahtar kelimeleri elde etmek için programlı yol

:

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 

) 

Sorum basit:

programlı Tüm anahtar kelimeleri erişmek için bir dahili-yolu var mı?

Projelerimden bazıları, numaralı kullanıcı girdisine karşı bir sorgu çalıştırmalı ve aynı diziyi tüm bu projelerde tanımlamak zorunda kalması biraz can sıkıcıdır.

+0

sorgunun ne tür çalıştırabilirim deneyin? Girişi bu anahtar kelime listesine göre neden kontrol etmeniz gerekiyor? Girişi değerlendiriyor musun? Tehlikeli olabilecek diğer Ruby yöntemleri hakkında (ör. "FileUtils.rm_r")? – spickermann

+1

Bir önceki soruyu Matz'dan bir alıntıyla tamamlıyorum: "_The Ruby çözümleyicisi esnektir ve bu anahtar kelimeleri @, @@ veya $ önekleriyle önek ekleyip bunları örnek, sınıf veya global değişken adları olarak kullanırsanız şikayet etmez. bu anahtar kelimeleri saklıdır. " Ayrıca, bu anahtar kelimelerle girdileri kabul etmemeniz gerektiğini düşünüyorsanız, bu bir hata olabilir. Böylece soruyu tekrar ediyorum: neden anahtar kelime listesine ihtiyacınız var? – romainsalles

cevap

6

bu kodu :)

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 kaynağındaki anahtar kelime tablosu] (https://github.com/ruby/ruby/blob/ruby_2_2/defs/keywords) '__ENCODING__' içermesi ilginç. Bu kod, tüm bunlardan daha fazlasını döndürür. –

+1

Muhtemelen bunun, ana kütüphane değil, stdlib'deki "irb" kütüphanesinin bir parçası olduğundan bahsetmelisiniz, bu yüzden ilk önce "irb/ruby-token" gerektiren "ihtiyacınız" olmalıdır. Ayrıca, IRb'nin ayrıştırıcısının buggy olduğu iyi bilinir, bu yüzden burada elde ettiğiniz sonuçlar mutlaka Ruby özelliklerine uymaz. Ve, belgelenmemiş, bu yüzden haber verilmeksizin değişebilir. –

+0

Bu işe yarıyor gibi görünüyor! Daha iyi bir şey gelene kadar ona bağlı kalacağım. :) – shevy

0

Bunu yapabileceğinizi sanmıyorum, çünkü ayrıştırıcıda tanımlanacaktır.

Sizin alternatif kaynak koduna bakmak olacaktır: https://github.com/ruby/ruby/blob/ruby_2_1/defs/keywords

+0

İlk kapanış: 'Object.methods' * * Nesne' sınıfındaki yöntemleri göstermeyecek, 'Object' * nesnesinin * temel olarak sınıfın yöntemleri olan yöntemlere yanıt verdiği yöntemleri gösterecektir. 'Object' sınıfı değil, çünkü' Object' 'Class'ın bir örneğidir. İstediğiniz "Object.instance_methods". Ancak, ne 'Object.instance_methods' ne de 'Object.constants' size anahtar kelimeleri gösterecektir. Yöntemleri ve sabitleri gösterecek (duh!) –

+0

Bilmek güzel, cevabı düzenledim. – Pran

İlgili konular