Báo giá kép so với đơn


171

Tôi thực sự mới để Ruby và tôi đang cố gắng để hiểu được nếu có một thời gian cụ thể khi nào tôi nên sử dụng ""vs ''.

Tôi đã sử dụng các trích dẫn duy nhất trong hầu hết thời gian vì nó dễ gõ hơn nhưng tôi không chắc là mình có nên không.

ví dụ get 'user/new'vsget "user/new"


12
Bạn có chắc chắn rằng đây là câu hỏi RoR, và không chỉ là câu hỏi Ruby?
Ignacio Vazquez-Abrams

Có hướng dẫn kiểu nào phù hợp về việc chọn khi không cần nội suy chuỗi không?
William Entriken

Câu trả lời:


202

" " cho phép bạn thực hiện phép nội suy chuỗi, ví dụ:

world_type = 'Mars'
"Hello #{world_type}"

1
Vì vậy, về cơ bản, chỉ cần sử dụng dấu ngoặc kép mọi lúc, phải không?
nekonari

8
Không - dấu ngoặc kép đơn giản cho phép nội suy chuỗi. Nếu bạn không muốn nội suy chuỗi, thì bạn không nên sử dụng dấu ngoặc kép.
Panh

4
Không có lý do để sử dụng dấu ngoặc kép chỉ khi bạn cần nội suy, không có tác động hiệu suất đáng kể và nó sẽ chỉ khiến bạn nghĩ những gì bạn phải sử dụng. Chỉ cần sử dụng chuỗi trích dẫn kép.
Matheus

137

ngoại trừ phép nội suy, một điểm khác biệt nữa là 'chuỗi thoát' không hoạt động trong một trích dẫn

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
Ngoại trừ việc thoát khỏi dấu ngoặc đơn, ví dụ 'don\'t'.
Sparhawk

3
Đây là một câu trả lời rất hữu ích cho qvestion này. Tôi chưa bao giờ nhận ra rằng trích dẫn đơn là để in mọi thứ theo nghĩa đen giữa các trích dẫn đơn, ngoại trừ các trích dẫn phải được thoát. Cảm ơn bạn.
Jay Godse

6
Và dấu gạch chéo ngược cũng thử puts '\\'Nó sẽ chỉ in một dấu gạch chéo. xem tại đây stackoverflow.com/questions/25499046/ cường
Hardik

yup, có phải là hai trường hợp duy nhất bạn có thể thoát với dấu ngoặc đơn
Alexis

@Alexis không chắc chắn, có thể có một chút khác biệt về hiệu suất
lfx_cool 2/11/2016

40

Để trả lời câu hỏi của bạn, bạn phải sử dụng ""khi bạn muốn thực hiện phép nội suy chuỗi:

a = 2
puts "#{a}"

Sử dụng dấu ngoặc đơn giản khác.

Ngoài ra nếu bạn đang tự hỏi về việc liệu có sự khác biệt về hiệu suất hay không, có một câu hỏi tuyệt vời về vấn đề này trên StackOverflow.

Và nếu bạn thực sự mới với RoR, tôi khuyên bạn nên chọn một cuốn sách Ruby đàng hoàng để học những điều cơ bản của ngôn ngữ. Nó sẽ giúp bạn hiểu những gì bạn đang làm (và sẽ khiến bạn không nghĩ rằng Rails là ma thuật). Cá nhân tôi đề nghị The Ruby căn cứ tốt .


34

Có một sự khác biệt giữa các ''trích dẫn đơn và kép ""trong Ruby về những gì được đánh giá theo chuỗi.

Ban đầu, tôi muốn làm rõ rằng trong các hình thức văn chương của một chuỗi bất cứ điều gì là giữa đơn hoặc đôi dấu ngoặc kép được đánh giá là một đối tượng chuỗi, mà là một thể hiện của lớp của Ruby String.

Do đó, 'stackoverflow'"stackoverflow"cả hai sẽ đánh giá các thể hiện của lớp String không có sự khác biệt nào cả .

Sự khác biệt

Sự khác biệt cơ bản giữa hai dạng chuỗi theo nghĩa đen (dấu ngoặc đơn hoặc dấu ngoặc kép) là dấu ngoặc kép cho phép thoát chuỗi trong khi dấu ngoặc đơn thì không!

Một chuỗi ký tự được tạo bởi các dấu ngoặc đơn không hỗ trợ xen kẽ chuỗikhông thoát khỏi chuỗi.

Một ví dụ gọn gàng là:

"\n" # will be interpreted as a new line

trong khi

'\n' # will display the actual escape sequence to the user

Nội suy với dấu ngoặc đơn hoàn toàn không hoạt động:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

Thực hành tốt nhất

Vì hầu hết các Ruby Linters đề nghị sử dụng các trích dẫn đơn cho các chuỗi của bạnsử dụng các chuỗi kép trong trường hợp nội suy / thoát chuỗi.


1
Vì vậy, nếu bạn có a = '\ n' và b = "# {a}", b sẽ được hiểu là một dòng mới hoặc là chuỗi thoát?
NathanTempelman

4
Khoảnh khắc bạn gán a = '\ n' a được hiểu là "\\ n" bằng cách xen kẽ a đến b bạn sẽ không nhận được một dòng mới. b sẽ đánh giá lại thành "\\ n" (không có dòng mới nào bạn có được chuỗi thoát). a = '\ n' => "\\ n" trong đó a = "\ n" => "\ n"
aloucas

6

Một chuỗi trích dẫn đơn không xử lý mã thoát ASCII (\ n, \ t, v.v.) và chúng không thực hiện phép nội suy chuỗi trong khi trích dẫn kép thực hiện cả hai.

Ví dụ mã thoát:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

Ví dụ nội suy:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27

4

Tương tự như câu trả lời "\ n" trong in ấn, sau đây là một trường hợp khác về sự khác biệt

puts "\1"  -> get special character
puts '\1'  -> get \1

vì vậy có vẻ như * đã được chuyển đổi thành ký tự thoát trong dấu ngoặc kép, nhưng không phải trong dấu ngoặc đơn. BTW, nó sẽ tác động đến đầu ra khi sử dụng trong biểu thức chính quy, ví dụ: str.gsub (/ biểu thức chính /, '\ 1, \ 2')


2

Một lý do khác mà bạn muốn sử dụng dấu ngoặc đơn là khi truyền mẫu regex dưới dạng chuỗi:

Mẫu regex này sẽ hoạt động vì được chuyển trong dấu ngoặc đơn:

"123 ABC".match('\d')
=> #<MatchData "1">

Mẫu regex này sẽ thất bại vì được chuyển trong dấu ngoặc kép (bạn sẽ phải thoát hai lần để nó hoạt động):

"123 ABC".match("\d")
=> nil

-8

Trong trường hợp cụ thể này, không có gì khác biệt khi bạn viết nó. Chúng là tương đương. Ngoài ra, bạn có thể muốn đọc thêm một số hướng dẫn / hướng dẫn về Ruby :)


4
Chúng không tương đương, vì dấu ngoặc kép cho phép giải thích chuỗi.
Jason Noble

7
Bạn đã đọc phần "Trong trường hợp cụ thể này", trước khi thực hiện quan sát cực kỳ thông minh đó?
Geo

9
Có, nhưng câu hỏi của anh ấy là khi nào nên sử dụng dấu ngoặc đơn so với dấu ngoặc kép.
Jason Noble
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.