2010-02-06 40 views

Trả lời

21

Ruby 1.8 có cú pháp? -prefix biến một ký tự thành giá trị mã ASCII của nó. Ví dụ: ?a là giá trị ASCII cho chữ cái a (hoặc 97). Dấu hỏi kép bạn thấy thực sự chỉ là số 63 (hoặc giá trị ASCII cho ?).

?a # => 97 
?b # => 98 
?c # => 99 
?\n # => 10 
?? # => 63 

Để chuyển đổi trở lại, bạn có thể sử dụng chr phương pháp:

97.chr # => "a" 
10.chr # => "\n" 
63.chr # => "?" 

??.chr # => "?" 

Trong của Ruby 1,9, cú pháp ?a trả về nhân vật chính (cũng như cú pháp khung vuông trên dây):

??   # => "?" 

"What?"[-1] # => "?" 
+0

Sẽ chính xác khi nói rằng cú pháp '?' Không được dùng trong phiên bản 1.9, vì nó hiện đang phục vụ cho mục đích nhỏ? –

+0

Myrddin, Đó có lẽ là một điều công bằng để nói. Tôi không thấy nhiều điểm trong việc sử dụng '? 'Cú pháp trong 1.9. –

2

Như Ryan cho biết, tiền tố ? cung cấp cho bạn giá trị ASCII của ký tự. Lý do tại sao điều này hữu ích trong ngữ cảnh này là khi bạn sử dụng ký pháp chỉ mục trên một chuỗi trong Ruby 1.8, giá trị ASCII được trả về thay vì ký tự. ví dụ.

irb(main):009:0> str = 'hello' 
=> "hello" 
irb(main):010:0> str[-1] 
=> 111 

nên sau đây sẽ không kiểm tra nếu ký tự cuối cùng của một chuỗi là chữ 'o'

irb(main):011:0> str[-1] == 'o' 
=> false 

nhưng điều này sẽ:

irb(main):012:0> str[-1] == ?o 
=> true 

và (với điều kiện bạn biết cái gì? không!) cái này hơi rõ ràng hơn

irb(main):013:0> str[-1] == 111 
=> true 
+1

Ở trên áp dụng cho Ruby 1.8, chứ không phải 1.9 trong đó '" hello "[- 1] ==" o "' –

+2

Đây chính xác là lý do tại sao, trong ruby19, đó là '? O ==" o "', để ' "hello" [- 1] ==? o' trong cả ruby18 và ruby19. – rampion

+0

Cảm ơn glenn, tôi đã cập nhật câu trả lời để làm rõ bit chỉ áp dụng trong 1.8 – mikej