2012-03-09 15 views
11

Tôi muốn phân tích cú pháp đầu vào của người dùng bằng cách sử dụng các ảnh chụp được đặt tên để dễ đọc.Sử dụng các ảnh chụp đã đặt tên có khớp regex trong trường hợp của Ruby ... khi nào?

Khi họ nhập lệnh, tôi muốn chụp một số thông số và chuyển chúng. Tôi đang sử dụng RegExps trong một tuyên bố trường hợp và do đó tôi không thể chỉ định sự trở lại của /pattern/.named_captures.

Dưới đây là những gì tôi muốn để có thể làm (ví dụ):

while command != "quit" 
    print "Command: " 
    command = gets.chomp 
    case command 
    when /load (?<filename>\w+)/ 
    load(filename) 
    end 
end 
+0

Tôi không nghĩ rằng điều này là có thể theo cách thông minh như vậy. Tuy nhiên, "biến chụp ma thuật" ('$ n') vẫn có sẵn ... Tôi không chắc tại sao -1 :( –

+1

Vâng tôi có thể sử dụng $ 1 nhưng Ruby là tuyệt vời cho khả năng đọc của nó, tôi không Tôi không lo lắng về việc mất điểm, – Chris

Trả lời

13

tên chụp thiết lập các biến địa phương khi cú pháp này.

regex-literal =~ string 

Không được đặt theo cú pháp khác. # Xem rdoc(re.c)

regex-variable =~ string 

string =~ regex 

regex.match(string) 

case string 
when regex 
else 
end 

Tôi thích các ảnh chụp được đặt tên quá, nhưng tôi không thích hành vi này. Bây giờ, chúng ta phải sử dụng $ ~ trong trường hợp cú pháp.

case string 
when /(?<name>.)/ 
    $~[:name] 
else 
end 
+1

$ [~: name] không có tác dụng với tôi, nhưng $ ~ [: name] đã làm (theo câu trả lời khác) – Lynn

+0

Xin lỗi , thats typo của tôi: <. Cảm ơn bạn đã cho tôi biết! @Lynn – kachick

+0

FWIW, RuboCop khuyến cáo sử dụng '$ LAST_MATCH_INFO' thay vì' $ ~ '. [Xem thêm] (https://github.com/bbatsov/ruby -style-guide # không-khó hiểu-perlisms) – backpackerhh

7

này là xấu xí nhưng làm việc cho tôi trong Ruby 1.9.3:

while command != "quit" 
    print "Command: " 
    command = gets.chomp 
    case command 
    when /load (?<filename>\w+)/ 
    load($~[:filename]) 
    end 
end 

Hoặc bạn có thể sử dụng phần mở rộng tiếng Anh của $~, $LAST_MATCH_INFO.

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