Câu trả lời:
thử cái này:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
hoặc là
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
.map(&:capitalize)
hoặc ít nhất là chỉ đến nơi trong tài liệu bạn tìm thấy không? Tôi không thể tìm thấy bất kỳ tài liệu tham khảo đến đó. Ngoài ra, thỏa thuận với *' '
phần cuối của đoạn mã thứ hai là gì?
&:method
cú pháp trong map
là một cách ngắn gọn để gọi một phương thức trên mỗi mục trong mảng . Sau đó, bạn có thể gọi join
để biến mảng đó thành một chuỗi. Đây * ' '
là một cách khác để gọi tham gia . Bạn có thể nghĩ về nó như nhân các mục trong mảng với nhau để tạo ra một chuỗi.
Trong đường ray:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
w / o Đường ray:
"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")
#OBJECT IT OUT
def titleize(str)
str.split(/ |\_/).map(&:capitalize).join(" ")
end
#OR MONKEY PATCH IT
class String
def titleize
self.split(/ |\_/).map(&:capitalize).join(" ")
end
end
w / o Rails (tải ActiveSupport của rails để vá phương thức #titleize thành String
)
require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Rails titleize
sẽ chuyển đổi những thứ như dấu gạch ngang và dấu gạch dưới thành khoảng trắng và có thể tạo ra kết quả bất ngờ khác, đặc biệt là với các tình huống phân biệt chữ hoa chữ thường được chỉ ra bởi @JamesMcMahon:
"hEy lOok".titleize #=> "H Ey Lo Ok"
bởi vì nó có nghĩa là để xử lý mã vỏ lạc đà như:
"kirkDouglas".titleize #=> "Kirk Douglas"
Để xử lý trường hợp cạnh này, trước tiên bạn có thể làm sạch chuỗi của mình #downcase
trước khi chạy #titleize. Tất nhiên, nếu bạn làm điều đó, bạn sẽ xóa sạch mọi phân tách từ lạc đà:
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
"hello world".titleize
sẽ xuất ra "Hello World".
"One Two Three Fo Ur"
này khác với đầu ra mong muốn trong trường hợp này, nhưng có thể được mong muốn ở những đầu ra khác.
Một tùy chọn khác là sử dụng regex và gsub, trong đó có một khối:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)
duy trì viết hoa dự định trong các từ, ví dụ: "Jane mcCollins"
Nhìn vào phương thức viết hoa String #.
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
"hello world".split.each{|i| i.capitalize!}.join(' ')
each
khối đang bị loại bỏ. Việc !
sửa đổi các chuỗi được sản xuất split
tại chỗ. Nếu không có !
, capitalize
sẽ tạo ra một chuỗi viết hoa mới trên mỗi lần lặp, và sau đó loại bỏ ngay lập tức. Kết quả cuối cùng sẽ "hello world"
giống như chuỗi gốc. Với !
, mỗi chuỗi trong split
mảng 'd đang được thay đổi, và do đó, kết quả each
là một chuỗi các chuỗi viết hoa.
map
. Thú vị hack mặc dù. Điểm
Tôi đã sử dụng điều này cho một vấn đề tương tự:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
Điều này xử lý các trường hợp kỳ lạ sau đây tôi thấy đã thử các câu trả lời trước:
split
sẽ phân chia theo không gian theo mặc định, vì vậy bạn có thể làm cho nó thậm chí ngắn hơn:'one TWO three foUR'.split.map(&:capitalize).join(' ')