2012-03-13 26 views
7

Các rescue mà có thể gán một biến tham chiếu đến đối tượng lỗi có cú pháp này (=>)Cú pháp (=>) được sử dụng trong việc gán đối tượng lỗi cho biến `phương thức rescue` là gì?

rescue => e 

Nếu rescue là một trong những cuộc gọi phương pháp chung, ý nghĩa của => là những gì. Tôi có thể sử dụng cùng một cú pháp trên cuộc gọi phương thức khác không?

my_method arg1, arg2 => my_obj 
+3

Bạn có nghĩa là 'rescue => e' không? 'raise => e' không phải là Ruby hợp lệ. –

+0

Xin lỗi. 'rescue => e' – steveyang

+0

Không, nó là một cấu trúc cú pháp. Xem http://stackoverflow.com/questions/9669128/ruby-rescue-like-syntax#comment12281753_9669128, tôi tự hỏi tại sao điều này lại bị hỏi một cách đột ngột. –

Trả lời

4

Trong khi raise is indeed a method, rescue thì không. Nó là một từ khóa và được định nghĩa trên parse.y:10467. Như vậy, cú pháp bạn có là đặc biệt với rescue (kể từ => e không phải là bất kỳ loại nào là phương pháp đối số) và không hợp lệ đối với các phương thức (ít nhất là không có cùng ý nghĩa). Làm thế nào/ở đâu chính cú pháp rescue => e được định nghĩa trong trình phân tích cú pháp tôi không hoàn toàn chắc chắn.

0

Không, cú pháp trong giải cứu chỉ được sử dụng ở đó. Nếu bạn sử dụng tên lửa băm '=>' trong một cuộc gọi hàm như vậy, nó sẽ được hiểu là một băm, và nếu arg2 không được định nghĩa là một biến trước đó, nó sẽ là một lỗi.

def foo(a,b) 
    puts b.inspect 
end 

foo "bar", :baz => 5 #=> {:baz=>5} 

foo "bar", baz => 5 #=> NameError: undefined local variable or method `baz' 

baz = "flux" 

foo "bar", baz => 5 #=> {"flux"=>5} 
4

Như một số huấn luyện viên bóng đá/nhà triết học-vua có thể nói, đó là những gì nó được. Đây là số parse.y của Ruby. Của đặc biệt quan tâm là this part:

opt_rescue  : keyword_rescue exc_list exc_var then 
        compstmt 
        opt_rescue 
        ... 
       | none 
       ; 

exc_list  : arg_value 
        ... 
       | mrhs 
        ... 
       | none 
       ; 

exc_var   : tASSOC lhs 
        ... 
       | none 
       ; 

Giải thích
exc_list về cơ bản cho phép gì cả, một loại ngoại lệ, hoặc một (splatted) loạt các trường hợp ngoại lệ như rescue ZeroDivisionError, LoadError

exc_var có thể không có gì hay => some_variable

Do đó,

opt_rescue có thể là rescue hoặc cộng một hoặc cả hai bên trên.

Đó là chỉ được liệt kê ở đây là cú pháp đặc biệt để gán cho trường hợp ngoại lệ. Việc sử dụng duy nhất khác cho => là dành cho key-value association.

Cũng lưu ý rằng arg_valuemrhs nằm ở bên trái và lhs ở bên phải, theo như tôi có thể nói nơi duy nhất xảy ra điều này. Có người sửa tôi nếu tôi sai ở đây, nhưng không có bất kỳ việc chuyển nhượng "ngược lại" nào khác trong parse.y.

+1

Gah Tôi đã đi qua tất cả điều đó và bằng cách nào đó đã bỏ lỡ 'exc_var'. Tốt tìm. –

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