แปลงสตริงให้เป็นสัญลักษณ์ได้ในทับทิม


241

สัญลักษณ์มักจะแสดงเช่นนี้

:book_author_title

แต่ถ้าฉันมีสตริง:

"Book Author Title"

มีวิธีที่สร้างขึ้นใน rails / ruby ​​เพื่อแปลงมันเป็นสัญลักษณ์ที่ฉันสามารถใช้: สัญกรณ์ได้โดยไม่ต้องเปลี่ยนสตริงสตริง regex ดิบ?


แทนที่จะแปลงคุณ migh มีความสนใจในการเข้าถึงไม่แยแส - วิธีการทำงานอย่างเท่าเทียมกันสำหรับทั้งพารามิเตอร์สตริงและสัญลักษณ์
Boris Stitnicky

คำตอบ:


360

Rails มีActiveSupport::CoreExtensions::String::Inflectionsโมดูลที่ให้วิธีการดังกล่าว พวกเขาทุกคนน่าดู สำหรับตัวอย่างของคุณ:

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

มันใช้งานได้ดีจริงๆ! คุณสามารถมีคำพูดใด ๆ สภาพอากาศหรือไม่พวกเขาอยู่ในที่ตัวพิมพ์ใหญ่ พารามิเตอร์จะเรียงลำดับออก
TheLegend

มีวิธีใดที่จะย้อนกลับโดยไม่ใช้ gsub?
Zack

@ แซค.to_sและ.humanizeควรทำผลงานเว้นเสียแต่ว่าคุณจะต้องใช้อักษรตัวพิมพ์ใหญ่แบบเต็ม
Tyler Diaz

วิธีที่ดีในการแปลงอะไรก็ตามให้สามารถทำได้และยกเลิกการทำงาน .to_sym สามารถแปลงทิศทางเดียว (จากสตริงเป็นสัญลักษณ์) และ. to_s สามารถแปลงได้ (จากสัญลักษณ์เป็นสตริง) และหากคุณกำลังจัดการกับอาเรย์ให้พิจารณา. map (&: to_sym) หรือ. map (& to_s) เพื่อแปลงองค์ประกอบทั้งหมด
jasonleonhard

2
parameterize ('_'). to_sym สั้นกว่า parameterize.underscore.to_sym เล็กน้อย
IAmNaN

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
โปสเตอร์ต้นฉบับอาจมีความสุขกับคำตอบของ Rails แต่โพสต์นี้ตอบคำถามจริงที่ถาม
Russ Bateman

2
ไม่เป็นความจริงที่ว่า "[ to_sym] สามารถใช้เพื่อสร้างสัญลักษณ์ที่ไม่สามารถแสดงได้โดยใช้เครื่องหมาย: xxx" เป็นเช่นเดียวกับ:'cat and dog' 'cat and dog'.to_sym
Michael Dorst

2
หนึ่งยังสามารถทำสิ่งต่างชาติเช่นโดยไม่จำเป็นต้องสำหรับ:"cat and dog\n on a new line" to_sym
Michael Dorst

3
คำถามเกี่ยวกับการแปลงใน Ruby ไม่ใช่ Rails นี่คือคำตอบที่ถูกต้อง
Katarzyna

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

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

parameterize เป็นวิธีการรถไฟและมันช่วยให้คุณเลือกสิ่งที่คุณต้องการให้ตัวแยกเป็น มันเป็นเส้นประ "-" โดยค่าเริ่มต้น


14

สัญลักษณ์ฝึกงาน→ส่งคืนสัญลักษณ์ที่สอดคล้องกับ str สร้างสัญลักษณ์หากไม่มีอยู่ก่อนหน้านี้

"edition".intern # :edition

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


เช่นนี้ตั้งแต่การแก้ปัญหา string.to_sym ของฉันให้ฉันเตือนความปลอดภัย :)
นี่ส์มูลเลอร์

11

ใน Rails คุณสามารถทำได้โดยใช้underscoreวิธีการ:

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

รหัสที่ง่ายกว่าคือการใช้ regex (ทำงานกับ Ruby):

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

3
สิ่งนี้จะใช้ได้ถ้าคำทั้งหมดเริ่มต้นด้วยทุนถ้าเป็น "หมาอ้วนของฉัน" มันจะกลับมา: myfat_dog
TheLegend


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}

หวังว่ามันจะช่วยให้คนอย่างฉัน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.