2009-10-23 31 views
6

tôi đang học Ruby và tìm thấy mẫu mã này trong một số tài liệu:Cú pháp là gì? có nghĩa là trong ví dụ Ruby này?

require 'find' 

    total_size = 0 

    Find.find(ENV["HOME"]) do |path| 
    if FileTest.directory?(path) 
     if File.basename(path)[0] == ?. 
     Find.prune  # Don't look any further into this directory. 
     else 
     next 
     end 
    else 
     total_size += FileTest.size(path) 
    end 
    end 

Mục đích là để tổng hợp các kích thước tập tin của tất cả các file trong một cây, trừ các thư mục bắt đầu bằng một dấu chấm. Dòng if File.basename(path)[0] == ?. rõ ràng là đang thực hiện kiểm tra tên thư mục. Tôi đã viết như sau:

if File.basename(path)[0] == "." 

?. làm gì? (Có thể là một lỗi đánh máy, tôi giả sử.) Tôi đã không thấy cú pháp này được mô tả ở nơi khác.

Trả lời

11

?. trả về giá trị ASCII của dấu chấm. Bạn có thể đặt khá nhiều char bất kỳ sau dấu chấm hỏi để nhận giá trị ASCII, như ?a hoặc ?3 hoặc ?\\, v.v. Lý do chúng không so sánh nó với chuỗi "." là khi bạn lập chỉ mục thành chuỗi, bạn sẽ nhận được mã ASCII giá trị của char tại chỉ mục đó chứ không phải là char. Để có được char tại một chỉ mục nhất định, bạn có thể sử dụng [0, 1] làm chỉ mục. Vì vậy, các tùy chọn là:

if File.basename(path)[0] == ?. 

Hoặc:

if File.basename(path)[0, 1] == "." 

Hoặc thậm chí:

if File.basename(path)[0].chr == "." 
+0

Cảm ơn bạn! Bây giờ tôi nhớ lại việc đọc về toán tử đó. Lập trình viên Perl này có rất nhiều thứ để bỏ học. –

1

Có nghĩa là trả về mã ký tự của ký tự tiếp theo. Trong Ruby, nói chuỗi [0] cung cấp cho bạn một mã ký tự, do đó, nó giống như nói là ký tự đầu tiên là ".".

Điều thú vị là điều đó có nghĩa là các biểu thức như ???!?!?? hoàn toàn hợp pháp trong Ruby.

Hãy xem here.

+0

tôi vẫn chưa tìm thấy một phần của Ruby đó là "dễ học". –

+0

Tôi không biết nếu nó cực kỳ dễ học, nhưng nó có rất nhiều khía cạnh thực sự tốt đẹp cho cú pháp của nó. Tôi chủ yếu là một lập trình viên JavaScript và có rất nhiều lần tôi muốn tôi có cú pháp khối của Ruby hoặc "mọi thứ trả về một giá trị" trực giao của nó. –

+1

đó là một cách sử dụng hoàn toàn ngẫu nhiên của từ trực giao. – Peter

2

Đó là cách viết tắt cho mã điểm ASCII của dấu "." tính cách. Xem tài liệu trên numeric literals trong cú pháp Ruby.

>> ?. 
=> 46 
>> ?a 
=> 97 
+7

Lưu ý rằng hành vi này đã thay đổi trong Ruby 1.9. Trong Ruby 1.9, '? A' trả về chuỗi' "a" ', nhất quán với việc lập chỉ mục một chuỗi, cũng trả về một chuỗi thay vì một số. – newacct

Các vấn đề liên quan