2009-08-13 63 views
667

Tôi đang xem tài liệu cho FileUtils. Tôi bị nhầm lẫn bởi dòng sau:% w (mảng) có nghĩa là gì?

FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6' 

Ý nghĩa %w là gì? Bạn có thể chỉ cho tôi tài liệu hướng dẫn không?

Trả lời

986

%w(foo bar) là phím tắt cho ["foo", "bar"]. Nghĩa là một ký hiệu để viết một chuỗi các chuỗi được phân cá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 zenspider's quickref.

+171

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

+119

Cách đơn giản nhất để ghi nhớ ý nghĩa của cụm từ này là "mảng cách nhau (w) được phân tách". – Julik

+5

Xem "Đầu vào được phân định chung" tại đây http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html –

28

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

+8

Đối với sự khác biệt giữa% W và% w, hãy xem http://stackoverflow.com/questions/690794/ruby-arrays -w-vs-w –

376

Tôi nghĩ về %w() là một "mảng từ" - các phần tử được phân tách bằng dấu cách.

Có% literals 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 đơn trích dẫn (và có thể là nhiều dòng, đó là hữu ích)
  • %Q() đưa ra một chuỗi dụng dấu ngoặc kép
  • %x() là một lệnh shell
  • %i() đưa ra một mảng các biểu tượng (Ruby> = 2.0.0)
  • %s() biến foo thành một biểu tượng (:foo)

Tôi không biết bất kỳ người khác, nhưng có thể có một số rình rập xung quanh trong đó ...

+28

Như của Ruby 2.0.0 bạn cũng có thể sử dụng '% i()' để tạo ra một mảng các ký hiệu. –

+58

Như của Lisp 1 (~ 1962) bạn có thể sử dụng '(a b c)' để tạo ra một danh sách các biểu tượng. – Kaz

+5

Ngoài ra còn có '%()' (hoặc '% []' hoặc '% {}') cung cấp chuỗi kép được trích dẫn và thoát khỏi dấu ngoặc kép, như '% Q()'. Ví dụ. '% (" tên người gửi "<[email protected]>) # =>" \ "tên người gửi \" <[email protected]> "' – Dennis

56

Ngoài ra còn có %s cho phép bạn tạo ra bất kỳ biểu tượng, 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ừ của 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... 
15

Mặc dù nó là một bài cũ, câu hỏi tiếp tục mọc lên và những câu trả lời không phải lúc nào dường như rõ ràng với tôi, vì vậy, đây là suy nghĩ của tôi:

%w%W là ví dụ về Đầu vào được phân tách chung loại, có liên quan đến Mảng. Có các 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 nháy đơn và kép. Với dấu nháy đơn và (chữ thường) %w, chúng tôi không có nội suy mã (#{someCode}) và một phạm vi giới hạn ký tự thoát hoạt động (\\, \n). Với dấu ngoặc kép và (chữ hoa) %W chúng tôi do có quyền truy cập vào các tính năng này.

Dấu phân tách được sử dụng có thể là bất kỳ ký tự nào, không chỉ 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.

Đối với một đầy đủ viết lên những ví dụ về %w và danh sách đầy đủ, thoát khỏi nhân vật và delimiters, có một cái nhìn tại "Ruby - %w vs %W – secrets revealed!"

10

Trích từ tài liệu cho Strings Percent tại http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings:

Bên cạnh% (...) tạo String,% có thể tạo các loại đối tượng khác. Cũng giống như các chuỗi, một chữ cái hoa cho phép nội suy và ký tự thoát trong khi một chữ thường sẽ vô hiệu hóa chúng.

Đây là những loại dây phần trăm trong ruby:
...
% w: Array của Strings

+2

Xin 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 do người khác cung cấp bị hỏng. – Gerry

+0

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

6

Thay vì %w() chúng ta nên sử dụng %w[]

Theo phong cách của Ruby hướng dẫn:

Ưu tiên% w với cú pháp mảng chữ khi bạn cần một mảng từ (chuỗi không trống s không có dấu cách và các 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 thích hợp nhất cho các loại chữ% khác nhau.

[] cho mảng chữ (%w, %i, %W, %I) vì nó được căn chỉnh với các mảng chuẩn của mảng.

# bad 
%w(one two three) 
%i(one two three) 

# good 
%w[one two three] 
%i[one two three] 

Để đọc thêm here.

1

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, với khoảng trắng. Cách đơn giản nhất tôi tìm thấy để có được chúng trong khi đang sử dụng ruby ​​đã làm:

names = %(Porter Smith 
Jimmy Jones 
Ronald Jackson).split('\n') 

này nhấn mạnh rằng %() tạo ra một chuỗi như "Porter Smith\nJimmyJones\nRonald Jackson" và để có được mảng bạn split chuỗi trên "\n"["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Vì vậy, để trả lời câu hỏi gốc của OP quá, họ có thể đã viết %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') nếu xảy ra space khi bạn muốn space tồn tại trong đầu ra mảng cuối cùng.