% W (mảng) có nghĩa là gì?


836

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'

%wnghĩa là gì? Bạn có thể chỉ cho tôi các tài liệu?

Câu trả lời:


1245

%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 .


199
Ngoài ra, dấu ngoặc đơn có thể gần như bất kỳ ký tự nào khác, chẳng hạn như dấu ngoặc vuông% w [...], dấu ngoặc nhọn% w {...} hoặc thậm chí một cái gì đó như dấu chấm than% w! ...!. Tất cả đều có cùng một hành vi (trả về một mảng).
ryanb

143
Cách dễ nhất để ghi nhớ thường xuyên điều này có nghĩa là "Mảng tách biệt khoảng trắng (w)".
Julik

7
Xem "Đầu vào được phân tách chung" tại đây ruby-doc.org/docs/ProgrammingRuby/html/lingu.html
Jared Beck

121
Nếu chuỗi có khoảng trắng, chỉ cần thoát chúng bằng \. Vd:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy

6
Đoán trang này cũng sẽ giải quyết được câu hỏi: ruby-doc.org/core-2.0/doc/syntax/ mẹo
TheConstructor 21/07/13

471

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 foothà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 đó ...


32
Kể từ Ruby 2.0.0, bạn cũng có thể sử dụng %i()để tạo một mảng các ký hiệu.
David Tuite

10
Ngoài ra còn có %()(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>"
Dennis

59

Ngoài ra còn %scó 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...


22

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%Wlà 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%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) %Wchú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ụ %wvà 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ộ! "


17

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 .


11

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


2
Cảm ơn! Tôi đã bắt đầu nghĩ rằng nó không tồn tại. Các liên kết rubydoc được cung cấp bởi những người khác bị hỏng.
Gerry

Tài liệu này không dành cho những thứ này không được bao gồm trong RubyDocs trong một thời gian dài.
Tin Man

2

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 splitchuỗ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ó spacekhi bạn muốn spacetồn tại trong đầu ra mảng cuối cùng.

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.