रूबी में स्ट्रिंग को प्रतीक-रूप में परिवर्तित करें


241

प्रतीकों को आमतौर पर ऐसे रूप में दर्शाया जाता है

:book_author_title

लेकिन अगर मेरे पास एक स्ट्रिंग है:

"Book Author Title"

वहाँ एक तरह से बनाया गया है रेल्स / रूबी इसे एक प्रतीक में बदलने के लिए जहां मैं : बिना कच्ची स्ट्रिंग रेगेक्स को किए बिना नोटेशन का उपयोग कर सकता हूं ?


जवाबों:


360

रेल को ActiveSupport::CoreExtensions::String::Inflectionsमॉड्यूल मिला जो इस तरह के तरीके प्रदान करता है। वे सब देखने लायक हैं। अपने उदाहरण के लिए:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title

यह वास्तव में अच्छी तरह से काम करता है! आपके पास कोई भी शब्द मौसम हो सकता है या नहीं, जहां वे Capitalized हैं। पैरामीटर इसे छांटेगा।
द लीजेंड

वहाँ किसी भी तरह से यह रिवर्स करने के लिए है, gsub का उपयोग कर के बिना?
ज़ैक

@Zack .to_sऔर .humanizeतब तक काम करना चाहिए जब तक आपको पूर्ण पूंजीकरण को संरक्षित करने की आवश्यकता न हो।
टायलर डियाज

किसी भी चीज को परिवर्तित करने के लिए एक अच्छा तरीका एक ऑपरेशन को करना और उसे पूर्ववत करना है। .to_sym एक दिशा (स्ट्रिंग से प्रतीक के लिए), और .__ परिवर्तित कर सकते हैं (प्रतीक से स्ट्रिंग तक)। और यदि आप किसी सरणी पर विचार कर रहे हैं, तो सभी तत्वों को परिवर्तित करने के लिए .map (&: to_sym) या .map ((to_s) पर विचार करें।
जस्सोनलहार्ड

2
पैरामीटराइज़ ('_')। to_sym, standardize.underscore.to_sym से थोड़ा छोटा है।
आईएएमएनएन

228

से: http://ruby-doc.org/core/classes/String.html#M000809

str.intern => symbol
str.to_sym => symbol

strयदि यह पहले से मौजूद नहीं था, तो सिंबल बनाते हुए सिंबल लौटाता है। देख लो Symbol#id2name

"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true

इसका उपयोग उन प्रतीकों को बनाने के लिए भी किया जा सकता है जिन्हें :xxxअंकन का उपयोग करके नहीं दिखाया जा सकता है।

'cat and dog'.to_sym   #=> :"cat and dog"

लेकिन आपके उदाहरण के लिए ...

"Book Author Title".gsub(/\s+/, "_").downcase.to_sym

जाना चाहिए ;)


1
शानदार उदाहरण। धन्यवाद।
पॉल

8
हो सकता है कि मूल पोस्टर रेल के उत्तर से खुश हो गया हो, लेकिन यह पोस्ट पूछे गए वास्तविक प्रश्न का उत्तर देता है।
रस बेटमैन

2
यह सच नहीं है कि "[ to_sym] का उपयोग उन प्रतीकों को बनाने के लिए भी किया जा सकता है जिनका उपयोग करके प्रतिनिधित्व नहीं किया जा सकता है: xxx संकेतन"। :'cat and dog'के रूप में ही है 'cat and dog'.to_sym
माइकल डोरस्ट

2
यहां तक :"cat and dog\n on a new line"कि जरूरत के बिना भी इस तरह के बाहरी काम कर सकते हैं to_sym
माइकल डोरस्ट

3
सवाल रूबी में धर्मांतरण को लेकर था, रेल्स पर नहीं। यह एक सही उत्तर है।
कतार्ज़ीना

26
"Book Author Title".parameterize('_').to_sym
=> :book_author_title

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

पैरामीटराइज़ एक रेल विधि है, और यह आपको यह चुनने देता है कि आप क्या चाहते हैं कि विभाजक हो। यह डिफ़ॉल्ट रूप से एक डैश "-" है।


14

इंटर्न → सिंबल str से संबंधित सिंबल लौटाता है, यदि यह पहले से मौजूद नहीं था तो सिंबल का निर्माण करता है

"edition".intern # :edition

http://ruby-doc.org/core-2.1.0/String.html#method-i-intern


इस तरह से एक के बाद से मेरे string.to_sym समाधान मुझे एक सुरक्षा चेतावनी दे :)
Denny Mueller

11

रेल में आप इस underscoreविधि का उपयोग कर सकते हैं :

"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title

सरल कोड regex (रूबी के साथ काम करता है) का उपयोग कर रहा है:

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title

3
यह तभी काम करेगा जब सभी शब्द एक पूंजी से शुरू होते हैं, अगर यह "मेरा मोटा कुत्ता" था, तो यह वापस आ जाएगा: myfat_dog।
द लीजेंड


1

यह स्वयं प्रश्न का उत्तर नहीं दे रहा है, लेकिन मैंने इस प्रश्न को एक स्ट्रिंग को प्रतीक में बदलने और हैश पर उपयोग करने के लिए खोजा।

hsh = Hash.new
str_to_symbol = "Book Author Title".downcase.gsub(/\s+/, "_").to_sym
hsh[str_to_symbol] = 10
p hsh
# => {book_author_title: 10}

आशा है कि यह मेरी तरह किसी की मदद करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.