Ruby: Hợp nhất các biến trong một chuỗi


95

Tôi đang tìm một cách tốt hơn để hợp nhất các biến thành một chuỗi, trong Ruby.

Ví dụ: nếu chuỗi là một cái gì đó như:

"Các animal actionsự second_animal"

Và tôi có các biến cho animal, actionsecond_animal, cách ưa thích để đặt các biến đó vào chuỗi là gì?

Câu trả lời:


240

Cách thành ngữ là viết một cái gì đó như sau:

"The #{animal} #{action} the #{second_animal}"

Lưu ý dấu ngoặc kép (") xung quanh chuỗi: đây là kích hoạt để Ruby sử dụng thay thế trình giữ chỗ có sẵn của nó. Bạn không thể thay thế chúng bằng dấu ngoặc kép (') nếu không chuỗi sẽ được giữ nguyên.


2
Xin lỗi, có lẽ tôi đã đơn giản hóa vấn đề quá nhiều. Chuỗi sẽ được lấy từ cơ sở dữ liệu và biến phụ thuộc vào một số yếu tố. Thông thường tôi sẽ sử dụng thay thế cho 1 hoặc hai biến thể, nhưng điều này có khả năng nhiều hơn. Có suy nghĩ gì không?
FearMediocrity

Cấu trúc # {} có lẽ là nhanh nhất (mặc dù điều đó vẫn có vẻ trái ngược với tôi). Cũng như gợi ý của gix, bạn cũng có thể lắp ráp các chuỗi với + hoặc <<, nhưng có thể có một số chuỗi trung gian được tạo ra, điều này gây tốn kém.
Mike Woodhouse

Cách tốt nhất để biến Nội suy
Dragutescu Alexandru

115

Bạn có thể sử dụng định dạng giống như sprintf để đưa các giá trị vào chuỗi. Vì vậy, chuỗi phải bao gồm trình giữ chỗ. Đặt các đối số của bạn vào một mảng và sử dụng theo những cách sau: (Để biết thêm thông tin, hãy xem tài liệu về Kernel :: sprintf .)

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

Bạn thậm chí có thể chỉ định rõ ràng số đối số và xáo trộn chúng xung quanh:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

Hoặc chỉ định đối số bằng cách sử dụng khóa băm:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

Lưu ý rằng bạn phải cung cấp một giá trị cho tất cả các đối số cho %toán tử. Ví dụ, bạn không thể tránh việc xác định animal.


18

Tôi sẽ sử dụng hàm #{}tạo, như đã nêu trong các câu trả lời khác. Tôi cũng muốn chỉ ra rằng có một sự tinh tế thực sự cần chú ý ở đây:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

Trong khi các chuỗi có thể được tạo bằng các dấu nháy đơn (như được minh họa bởi các biến first_namelast_name, hàm #{}tạo chỉ có thể được sử dụng trong các chuỗi có dấu nháy kép.


13
["The", animal, action, "the", second_animal].join(" ")

là một cách khác để làm điều đó.


10

Đây được gọi là nội suy chuỗi và bạn làm như thế này:

"The #{animal} #{action} the #{second_animal}"

Quan trọng: nó sẽ chỉ hoạt động khi chuỗi nằm trong dấu ngoặc kép ("").

Ví dụ về mã sẽ không hoạt động như bạn mong đợi:

'The #{animal} #{action} the #{second_animal}'

Cảm ơn bạn đã sử dụng thuật ngữ thích hợp để các lập trình viên mới có thể học: nội suy.
Mike Bethany

3

Hệ thống tạo khuôn mẫu ERB tiêu chuẩn có thể phù hợp với kịch bản của bạn.

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

Bạn có thể sử dụng nó với các biến cục bộ của mình, như sau:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

đầu ra sẽ là: "Con chó liếm con chim "

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.