[英]Parens required or Ruby says: TypeError (class or module required) ... why?
我正在irb
Ruby 版本 3 中嘗試這個:
3.0.0 :001 > num = 42
=> 42
3.0.0 :002 > num.is_a?(Integer) && num > 10
=> true
3.0.0 :003 > num.is_a? Integer && num > 10
Traceback (most recent call last):
5: from /Users/kai/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
4: from /Users/kai/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
3: from /Users/kai/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
2: from (irb):3:in `<main>'
1: from (irb):3:in `is_a?'
TypeError (class or module required)
為什么我需要括號:
v.is_a?(Integer)
?
運算符優先級如何工作?
為什么 Ruby 在這種情況下會生成如此神秘的錯誤消息?
經過一番挖掘,我發現以前在這里回答了這個問題: Ruby 'is_a?' 需要類或模塊(TypeError)
以及這里解決的基本問題: 帶括號和不帶括號的方法調用的優先級是什么?
參考官方 Ruby 文檔:https ://ruby-doc.org/core-3.0.0/doc/syntax/precedence_rdoc.html
但我覺得我的所有問題都沒有得到解答。 有人願意把這一切都包得干干凈凈嗎?
為什么我需要括號:
v.is_a?(Integer)
您需要括號來指定要傳遞給is_a?
方法。 沒有它們,Ruby 會計算整個Integer && num > 10
表達式並將其傳遞給方法。
運算符優先級如何工作?
is_a?
不是運算符,因此它沒有優先級。 表達式在傳遞給方法之前被評估,這就是正在發生的一切。
為什么 Ruby 在這種情況下會生成如此神秘的錯誤消息?
Ruby 正在評估表達式Integer && num > 10
,它給出了true
。 然后將該值傳遞給num.is_a?
. is_a?
然后給出一個TypeError
,因為它需要一個類或模塊,而不是布爾值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.