2012-03-15 18 views
6

मैं कुछ कोड में एक त्रिगुट में आए और मैं समझने में कठिनाई आ रहा सशर्त:रूबी में आप इस कठिन स्थिति को कैसे पढ़ते हैं?

str.split(/',\s*'/).map do |match| 
    match[0] == ?, ? 
    match : "some string" 
end.join 

मुझे समझ नहीं है कि मैं कुछ बिंदुओं पर एक स्ट्रिंग बंटवारे और एक सरणी के कुल परिणाम में परिवर्तित करने, और के साथ काम कर रहा हूँ बारी में सरणी के प्रत्येक तत्व। इसके अलावा मुझे नहीं पता कि क्या हो रहा है।

उत्तर

7

एक (थोड़ा) कम भ्रामक इस लिखने के लिए तरीका है:

str.split(/',\s*'/).map do |match| 
    if match[0] == ?, 
    match 
    else 
    "some string" 
    end 
end.join 

मुझे लगता है कि बहु त्रिगुट बयान भयानक हैं, खासकर जब से if ब्लॉक रूबी में लौट सकते हैं।

शायद सबसे भ्रमित चीज ?, है जो एक वर्ण शाब्दिक है। रुबी 1.8 में इसका मतलब है कि चरित्र के ASCII मूल्य (इस मामले में 44), रुबी 1.9 में यह केवल एक स्ट्रिंग है (इस मामले में ",")।

केवल "," के बजाय वर्ण अक्षर का उपयोग करने का कारण यह है कि रूबी 1.9 में एक स्ट्रिंग पर [] को कॉल करने का वापसी मूल्य बदल गया है। In 1.8 it returned the ASCII value of the character at that position, in 1.9 it returns a single-character string?, का उपयोग करके रूबी 1.8 & 1.9 के बीच String#[] में मतभेदों के बारे में चिंता करने से बचा जाता है।

आखिरकार सशर्त जांच कर रहा है कि match में पहला अक्षर , है, और यदि ऐसा है तो यह मान को समान रखता है, अन्यथा यह "some string" पर सेट होता है।

+0

धन्यवाद @AndrewMarshall, अगर यह 'match == (?,) था तो इससे मदद मिलेगी? मैच: "कुछ स्ट्रिंग" '? या इसका मतलब कुछ और होगा? – ismail

+0

@IsmailTabtabai यह वही होगा। जब भी मैं टर्नरी स्टेटमेंट करता हूं, मैं आमतौर पर पूरे सशर्त कथन को ब्रांड्स में लपेटता हूं ताकि यह स्पष्ट हो सके कि यह कहां है, लेकिन यह सिर्फ शैली है। चरित्र अक्षर शायद रूबी के कम ज्ञात वाक्य रचनात्मक संरचनाओं में से एक हैं, और जब आप नहीं जानते कि यह क्या है (विशेष रूप से जब अन्य 'के साथ जोड़ा जाता है) तो बहुत भ्रमित हो सकता है। –

+0

इसका मतलब एक ही बात है। तो [0] ==? से मिलेंगे? मैच: "कुछ स्ट्रिंग" – Bijan

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