Tôi đang xem tài liệu về FileUtils.
Tôi bối rối bởi dòng sau:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
Có %w
nghĩa là gì? Bạn có thể chỉ cho tôi các tài liệu?
Tôi đang xem tài liệu về FileUtils.
Tôi bối rối bởi dòng sau:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
Có %w
nghĩa là gì? Bạn có thể chỉ cho tôi các tài liệu?
Câu trả lời:
%w(foo bar)
là một phím tắt cho ["foo", "bar"]
. Có nghĩa đó là một ký hiệu để viết một chuỗi các chuỗi được phân tách bằng dấu cách thay vì dấu phẩy và không có dấu ngoặc kép xung quanh chúng. Bạn có thể tìm thấy một danh sách các cách viết chữ trong quickref của zenspider .
%w(ab\ c def) # => ["ab c", "def"]
Tôi nghĩ về %w()
một "mảng từ" - các phần tử được phân cách bằng dấu cách và nó trả về một chuỗi các chuỗi.
Có% nghĩa đen khác:
%r()
là một cách khác để viết một biểu thức chính quy.%q()
là một cách khác để viết một chuỗi trích dẫn đơn (và có thể là nhiều dòng, rất hữu ích)%Q()
đưa ra một chuỗi trích dẫn kép%x()
là một lệnh shell%i()
đưa ra một loạt các ký hiệu (Ruby> = 2.0.0)%s()
biến foo
thành biểu tượng ( :foo
)Tôi không biết bất kỳ ai khác, nhưng có thể có một số ẩn giấu trong đó ...
%i()
để tạo một mảng các ký hiệu.
%()
(hoặc %[]
hay %{}
) mang đến cho một chuỗi trích dẫn đôi và thoát dấu ngoặc kép, như %Q()
. Ví dụ:%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Ngoài ra còn %s
có cho phép bạn tạo bất kỳ biểu tượng nào, ví dụ:
%s|some words| #Same as :'some words'
%s[other words] #Same as :'other words'
%s_last example_ #Same as :'last example'
Kể từ Ruby 2.0.0, bạn cũng có:
%i( a b c ) # => [ :a, :b, :c ]
%i[ a b c ] # => [ :a, :b, :c ]
%i_ a b c _ # => [ :a, :b, :c ]
# etc...
%W
và%w
cho phép bạn tạo một chuỗi các chuỗi mà không cần sử dụng dấu ngoặc kép và dấu phẩy.
Mặc dù đó là một bài viết cũ, câu hỏi tiếp tục được đưa ra và câu trả lời không phải lúc nào cũng rõ ràng đối với tôi, vì vậy, đây là suy nghĩ của tôi:
%w
và %W
là ví dụ về các loại Đầu vào được phân tách chung , có liên quan đến Mảng. Có nhiều loại khác bao gồm %q
, %Q
, %r
, %x
và %i
.
Sự khác biệt giữa phiên bản chữ hoa và chữ thường là nó cho phép chúng ta truy cập vào các tính năng của dấu ngoặc đơn và dấu ngoặc kép. Với dấu ngoặc đơn và (chữ thường) %w
, chúng tôi không có phép nội suy mã ( #{someCode}
) và một phạm vi ký tự thoát giới hạn hoạt động ( \\
, \n
). Với dấu ngoặc kép và (chữ hoa) %W
chúng ta có quyền truy cập vào các tính năng này.
Dấu phân cách được sử dụng có thể là bất kỳ ký tự nào, không chỉ là dấu ngoặc đơn mở. Chơi với các ví dụ trên để thấy rằng có hiệu lực.
Để viết đầy đủ với các ví dụ %w
và danh sách đầy đủ, thoát các ký tự và dấu phân cách, hãy xem " Ruby -% w vs% W - bí mật được tiết lộ! "
Thay vì %w()
chúng ta nên sử dụng%w[]
Theo hướng dẫn phong cách Ruby:
Thích% w với cú pháp mảng bằng chữ khi bạn cần một mảng các từ (chuỗi không trống không có khoảng trắng và ký tự đặc biệt trong đó). Chỉ áp dụng quy tắc này cho các mảng có hai hoặc nhiều phần tử.
# bad
STATES = ['draft', 'open', 'closed']
# good
STATES = %w[draft open closed]
Sử dụng niềng răng phù hợp nhất cho các loại phần trăm khác nhau.
[]
đối với mảng bằng chữ ( %w, %i, %W, %I
) vì nó được liên kết với các mảng chữ chuẩn.
# bad
%w(one two three)
%i(one two three)
# good
%w[one two three]
%i[one two three]
Để đọc thêm ở đây .
Trích từ tài liệu về Chuỗi phần trăm tại http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :
Ngoài% (...) tạo Chuỗi,% có thể tạo các loại đối tượng khác. Cũng như các chuỗi, một chữ cái viết hoa cho phép nội suy và các ký tự thoát trong khi một chữ cái viết thường vô hiệu hóa chúng.
Đây là các loại chuỗi phần trăm trong ruby:
...
% w : Array of String
Tôi đã được cung cấp một loạt các cột từ bảng tính CSV có tên đầy đủ của người dùng và tôi cần giữ định dạng, có khoảng trắng. Cách dễ nhất tôi tìm thấy để đưa chúng vào trong khi sử dụng ruby là làm:
names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')
Điểm nổi bật này %()
tạo ra một chuỗi như "Porter Smith\nJimmyJones\nRonald Jackson"
và để lấy split
chuỗi cho bạn chuỗi trên"\n"
["Porter Smith", "Jimmy Jones", "Ronald Jackson"]
Vì vậy, để trả lời câu hỏi ban đầu của OP, họ có thể đã viết %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')
nếu có space
khi bạn muốn space
tồn tại trong đầu ra mảng cuối cùng.