2015-01-04 7 views
5

मेरे पास रूबी में सभी कीवर्ड के साथ एक ऐरे है।रुबी कीवर्ड प्राप्त करने के लिए प्रोग्रामेटिक तरीका

उदाहरण के लिए:

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' करते हैं? अन्य रूबी विधियों के बारे में क्या खतरनाक हो सकता है (उदा। 'FileUtils.rm_r')? – spickermann

+1

मैटज़ से उद्धरण के साथ पिछले प्रश्न को पूरा करता हूं: "_ रूबी पार्सर लचीला है और यदि आप इन कीवर्ड को @, @@ या $ उपसर्गों के साथ उपसर्ग करते हैं और उन्हें उदाहरण, कक्षा या वैश्विक चर नामों के रूप में उपयोग करते हैं तो शिकायत नहीं करते हैं। सर्वोत्तम अभ्यास इन खोजशब्दों को आरक्षित के रूप में व्यवहार करना है ._ "। साथ ही, अगर आपको लगता है कि आपको इन खोजशब्दों के साथ इनपुट स्वीकार नहीं करना चाहिए, तो यह एक त्रुटि हो सकती है। इस प्रकार मैं सवाल दोहराता हूं: आपको कीवर्ड सूची की आवश्यकता क्यों है? – 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

ऐसा नहीं है कि [गहरे लाल रंग का स्रोत में कीवर्ड तालिका] (https://github.com/ruby/ruby/blob/ruby_2_2/defs/keywords) __ENCODING__' शामिल 'दिलचस्प है। यह कोड सब कुछ देता है लेकिन वह एक। –

+1

आप शायद यह है कि इस stdlib में 'irb' पुस्तकालय, नहीं कोर पुस्तकालय का हिस्सा है, ताकि आप' की आवश्यकता होती है 'आईआरबी/माणिक token'' करने के लिए पहले होगा उल्लेख करना चाहिए। साथ ही, यह अच्छी तरह से ज्ञात है कि आईआरबी का पार्सर छोटी है, इसलिए आपके द्वारा यहां आने वाले परिणाम रूबी स्पेक से मेल नहीं खाते हैं। और, यह अनियंत्रित है, इसलिए बिना किसी सूचना के बदल सकते हैं। –

+0

यह काम करने लगता है, धन्यवाद! जब तक कुछ बेहतर नहीं आएगा तब तक मैं इसके साथ रहूंगा। :) – shevy

0

मुझे नहीं लगता कि आप कर सकते हैं, क्योंकि इसे पार्सर में परिभाषित किया जाएगा।

आपका वैकल्पिक स्रोत कोड को देखने के लिए होगा: https://github.com/ruby/ruby/blob/ruby_2_1/defs/keywords

+0

सबसे पहले: 'Object.methods' * नहीं *' Object' वर्ग पर तरीकों दिखाने के लिए, यह तरीकों कि 'Object' * वस्तु * प्रतिक्रिया करता है, जो मूल रूप से' Class' वर्ग के तरीके हैं दिखाएगा होगा 'ऑब्जेक्ट' वर्ग नहीं, क्योंकि 'ऑब्जेक्ट' 'कक्षा' का एक उदाहरण है। आप जो चाहते हैं वह 'Object.instance_methods' है। हालांकि, न तो 'Object.instance_methods' और न ही' Object.constants' आपको कीवर्ड दिखाएगा। यह विधियों और स्थिरांक दिखाने के लिए जा रहा है (duh!) –

+0

जानना अच्छा है, मैंने जवाब संपादित कर लिया है। – Pran

संबंधित मुद्दे