Chuyển đổi chuỗi thành biểu tượng có thể trong ruby


241

Biểu tượng thường được đại diện như vậy

:book_author_title

nhưng nếu tôi có một chuỗi:

"Book Author Title"

Có cách nào được xây dựng trong rails / ruby ​​để chuyển đổi nó thành một biểu tượng mà tôi có thể sử dụng : ký hiệu mà không cần thực hiện thay thế regex chuỗi thô không?


Câu trả lời:


360

Rails có ActiveSupport::CoreExtensions::String::Inflectionsmô-đun cung cấp các phương pháp như vậy. Tất cả đều đáng để xem xét. Ví dụ của bạn:

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

cái này hoạt động rất tốt bạn có thể có bất kỳ từ thời tiết hay không, nơi họ viết hoa. tham số hóa sẽ sắp xếp nó ra.
TheLegend

Có cách nào để đảo ngược điều này, mà không cần sử dụng gsub?
Zack

@Zack .to_s.humanizenên thực hiện công việc trừ khi bạn cần bảo toàn viết hoa.
Tyler Diaz

Một cách tốt để tiếp cận chuyển đổi mọi thứ là có thể thực hiện và hoàn tác một thao tác. .to_sym có thể chuyển đổi một hướng (từ chuỗi sang ký hiệu) và .to_s có thể chuyển đổi (từ ký hiệu sang chuỗi). và nếu bạn đang xử lý một mảng, hãy xem xét .map (&: to_sym) hoặc .map (& to_s) để chuyển đổi tất cả các yếu tố.
jasonleonhard

2
tham số hóa ('_'). to_sym ngắn hơn một chút so với tham số hóa.underscore.to_sym.
IAmNaN

228

từ: http://ruby-doc.org/core/groupes/String.html#M000809

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

Trả về Biểu tượng tương ứng với str, tạo biểu tượng nếu trước đó không tồn tại. Xem Symbol#id2name.

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

Điều này cũng có thể được sử dụng để tạo các biểu tượng không thể được biểu diễn bằng cách sử dụng :xxxký hiệu.

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

Nhưng ví dụ của bạn ...

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

nên đi ;)


1
Ví dụ rực rỡ. Cảm ơn bạn.
Paul

8
Người đăng ban đầu có thể hài lòng với câu trả lời của Rails, nhưng bài đăng này trả lời câu hỏi thực tế được hỏi.
Russ Bateman

2
Điều đó không đúng khi "[ to_sym] cũng có thể được sử dụng để tạo các ký hiệu không thể biểu diễn bằng ký hiệu: xxx". :'cat and dog'cũng giống như 'cat and dog'.to_sym.
Michael Dorst

2
Người ta thậm chí có thể làm những điều kỳ quặc như vậy :"cat and dog\n on a new line"mà không cần to_sym.
Michael Dorst

3
Câu hỏi là về chuyển đổi trong Ruby, không phải Rails. Đây là một câu trả lời đúng.
Katarzyna



11

Trong Rails, bạn có thể thực hiện việc này bằng underscorephương thức:

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

Mã đơn giản hơn đang sử dụng regex (hoạt động với Ruby):

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

3
điều này sẽ chỉ hoạt động nếu tất cả các từ bắt đầu bằng một chữ hoa, nếu đó là "Con chó béo của tôi" thì nó sẽ trở lại: myfat_dog.
TheLegend


1

Đây không phải là tự trả lời câu hỏi, nhưng tôi thấy câu hỏi này đang tìm kiếm giải pháp để chuyển đổi một chuỗi thành biểu tượng và sử dụng nó trên hàm băm.

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}

Hy vọng nó sẽ giúp một người như tôi!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.