簡體   English   中英

Parens required 或 Ruby 說:TypeError(需要類或模塊)......為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM