2013-05-29 30 views
6

tôi stumbled khi đoạn mã này trong nguồn ray:

# File actionpack/lib/action_view/helpers/output_safety_helper.rb, line 30 
def safe_join(array, sep=$,) 
    sep ||= "".html_safe 
    sep = ERB::Util.html_escape(sep) 

    array.map { |i| ERB::Util.html_escape(i) }.join(sep).html_safe 
end 

không $, làm gì? Tôi đọc số Regexp-documentation nhưng tôi không thể tìm thấy gì về nó.

Trả lời

5

cuối cùng tôi đã tìm thấy câu trả lời bản thân mình here:

Sản lượng lĩnh vực phân cách cho in ấn. Ngoài ra, nó là dấu phân cách mặc định cho Array # join. (Mnemonic: những gì được in khi có một, trong bản Tuyên Bố in của bạn.)

Đoạn mã sau đây cho thấy tác dụng:

a = [1,2,3] 

puts a.join # => 123 

$, = ',' 
puts a.join # => 1,2,3 
+4

FYI: http://ruby-doc.org/core/doc/globals_rdoc.html – Stefan

+0

Cuối cùng, như sau vài giây, theo thời gian đăng bài của bạn. – vgoff

+0

Vâng, đúng vậy, tôi đã tìm thấy câu trả lời trước khi tôi đăng câu hỏi. Có thể đăng câu trả lời cùng với câu hỏi của bạn. Tôi nghĩ đó là một bổ sung đáng giá vì tôi không thể tìm thấy câu hỏi ở đây. Vì vậy, trong khi tôi đăng nó đồng thời, đối với tôi nó cảm thấy như 'cuối cùng', như tôi tìm kiếm trong nửa giờ. – fabi

5

Các tài liệu chính thức cho các biến hệ thống đang ở:

http://www.ruby-doc.org/stdlib-2.0/libdoc/English/rdoc/English.html

Rất nhiều biến đặc biệt của Ruby có thể truy cập thông qua các phương thức trong các mô-đun và lớp khác nhau, biến này chứa giá trị. Ví dụ: lineno, có sẵn trong IO và được kế thừa bởi Tệp, là số dòng của dòng cuối cùng được đọc bởi luồng IO. Nó dựa trên các mô hình $/$.

Mô-đun "tiếng Anh" cung cấp phiên bản dài của các biến bí ẩn, làm cho nó dễ đọc hơn. Sử dụng các biến bí mật không phải là thành ngữ trong Ruby như chúng ở trong Perl, đó là lý do tại sao chúng lại tò mò hơn khi bạn chạy vào chúng.

Chúng đến từ nhiều nguồn khác nhau: hầu hết, nếu không phải tất cả, đều là Perl, nhưng Perl kế thừa từ sed, awk và phần còn lại của bộ sưu tập mã chìm trong bếp. (Đó là một ngôn ngữ tuyệt vời, thực sự.)

Có các biến khác được đặt bởi các lớp như Regexp, xác định các biến cho kết hợp trước và sau, cộng với các ảnh chụp. Đây là từ các tài liệu:

$~ is equivalent to ::last_match; 
$& contains the complete matched text; 
$` contains string before match; 
$' contains string after match; 
$1, $2 and so on contain text matching first, second, etc capture group; 
$+ contains last capture group. 

Mặc dù của Ruby định nghĩa ngắn gọn, khó hiểu, các phiên bản của các biến, nó được đề nghị mà chúng tôi sử dụng require "English" để cung cấp các tên dài. Đó là một điều dễ đọc, có nghĩa là một điều dễ bảo trì lâu dài.