Tôi đang chạy ruby 1.9.2p180 (2011-02-18 phiên bản 30909) [x86_64-linux].trong ruby, tại sao không được xác định? hoạt động như mong đợi khi được sử dụng với đảm bảo
#!/usr/bin/env ruby
def ouch()
raise ArgumentError, "woof"
fred = 3
return(nil)
ensure
if (defined?(fred)) then
printf("fred is defined (%s)\n", fred.inspect())
else
printf("fred is not defined\n")
end
end # ouch()
ouch()
Khi chạy, đầu ra từ tập lệnh ruby ở trên là khá bất ngờ.
$ ./ouch.rb
fred is defined (nil)
./ouch.rb:4:in `ouch': woof (ArgumentError)
from ./ouch.rb:22:in `<main>'
Vì vậy, tăng/ngoại lệ đang xảy ra, fred là không nhận được thiết lập để 3, nhưng nó là nhận được xác định và thiết lập để nil, qua đó đánh bại thử nghiệm cho định nghĩa?(). Điều này rất khó hiểu. Đây có phải là một lỗi? Rõ ràng là các thử nghiệm cho các nhu cầu được xác định để được theo sau bằng cách thử nghiệm cho không nil.
Nếu đây không phải là lỗi, ai đó có thể giải thích lý do không?
biến của Ruby được định nghĩa từ dòng trong mã nguồn của họ được giao nhiệm vụ đầu tiên. Bạn không thể sử dụng chúng trước khi được chỉ định. Vì vậy, chúng được _not_ "định nghĩa ở đầu khối mà chúng được sử dụng trong". –
@RobertKlemme Điểm tuyệt vời, cố định. – whitequark