Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyはあなたからエラーを隠しています!

Rubyは意図的にいくつかのエラーと例外をあなたから隠します。

これが役立つ場合もあります。

Kernel#loopを使用するときのように ブロックを使用するメソッド、 loop StopIterationが停止すると停止します 例外が発生します。

ただし、これによってデバッグセッションが非常に難しくなる場合もあります。

いくつかの例を見てみましょう!

非表示の例外:同等のモジュール+<=>メソッド

最初の例には、 Compareableが含まれます モジュールと<=> メソッド。

ここに例があります

class MyObject
  attr_accessor :value

  include Comparable

  def initialize(value)
    @value = value
  end

  def <=>(other)
    raise ArgumentError, "can't compare #{other.class} with #{self.class}" unless other.is_a?(MyObject)

    value <=> other.valuee
  end
end

mo1 = MyObject.new(10)
mo2 = MyObject.new(10)

p mo1 == mo2

この例について話しましょう。

最初

MyObjectという名前のクラスがあります 、1つのattr_accessor value 、および Compareableの包含 比較メソッドを追加するモジュール( ==など) 、<> )私たちのクラスに。

これらの比較方法は、 <=>に基づいています。 メソッド。

列挙可能なメソッドがeachに基づいているのと同じように メソッド。

次に

2つのオブジェクト( MyObject.new )を作成しています )同じ値( 10

同じ値であっても、異なるオブジェクトであることに注意してください。 、これは重要です。

ここで、これら2つのオブジェクトを比較すると mo1 mo2 falseを取得します …

なぜですか?

<=>にエラーがあるため メソッドですが、Rubyはそのエラーを隠しています!

よく見てください…

エラーを見つけられますか?

あなたがそれを良い仕事だと思ったら!そうでなければ大丈夫です🙂

こちら

value <=> other.valuee

このvalueeを参照してください ?

タイプミスがあることがわかりました!

通常、 NoMethodErrorを取得します 例外&私たちは問題がかなり迅速に何であるかを知るでしょう。ただし、この例ではありません。

幸いなことに、Ruby2.3以降これが変更されました。非表示ではなくなったため、エラーを確認できます。

古いバージョンのRubyをまだ実行している場合にアップグレードするもう1つの理由。

非表示の例外:数値オブジェクト+強制メソッド

非表示の例外のもう1つの例は、 Numericです。 オブジェクト( Float 整数 )プラス強制 メソッド。

ここに例があります

class MyObject
  attr_accessor :value

  def initialize(value)
    @value = value
  end

  def +(other)
    other = MyObject.new(other) if other.kind_of?(Numeric)

    value + other.value
  end

  def coerce(other)
    mo = MyObject.new
    mo.valuee = other

    [mo, self]
  end
end

mo1 = MyObject.new 10
mo2 = MyObject.new 10

p mo1 + mo2
# 20

p mo1 + 20
# 30

これは別のMyObject クラスですが、新しいメソッドを使用して、 + 強制

強制 メソッドを使用すると、互換性のない2つのタイプを操作し、それらを同じタイプに変換して、一緒に操作できるようになります。

この場合、クラスは数値を表します。これには、秒数、価格などがあります…

そして私たちはこの種の操作を実行できるようにしたいと考えています

mo1 + 20
20 + mo1

最初のもの( mo1 + 20 + を制御するので、簡単です クラスのメソッド。

しかし、整数はどうでしょうか クラス?

整数の+を変更できます これを実装する方法ですが、それはおそらく良い考えではありません🙂

解決策は?

強制を実装する 独自のクラスのメソッド。

+の1つ Integerのメソッド オブジェクトがこのメソッドを実装しているかどうかを確認し、実装している場合はそれを呼び出します。

さて、このセクションの冒頭のコード例を覚えていますか?

これを行おうとすると

20 + mo1

30を見たい 、 mo1の値が 10です 。しかし、私たちが見ているのはこれです:

MyObject can't be coerced into Fixnum

以前と同じ問題です!

coerce内にエラーが隠されています メソッド。

これ: mo.valuee =other

繰り返しになりますが、タイプミスがありますが、それはエラーが言っていることではありません!

MyObject can't be coerced into Fixnum

朗報です。この動作はRuby2.5で変更されているため、もう1つの隠れたエラーがなくなるので、心配する必要はありません。

概要

ご覧のとおり、これらは例外の非表示を避けたい理由の良い例です。例外について詳しくは、私の本、RubyDeepDiveをご覧ください。

より多くの人に見てもらえるように、この投稿を友達と共有していただければ幸いです。

読んでくれてありがとう!


  1. Rubyエイリアスキーワードの使用方法

    Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin

  2. Spotlight 検索からフォルダーを非表示にする

    個人の財務書類であろうと、他のものであろうと、他の人に見られたくないファイルやフォルダが Mac にあることは誰にでもあります。これらのファイルが他のユーザーに表示される方法の 1 つは、Mac のツールバーからアクセスできる Apple の組み込みシステム全体の検索である Spotlight 検索を使用することです。幸いなことに、Spotlight 検索で特定のフォルダーが表示されないようにする方法がいくつかあります。これにより、個人情報の盗難や恥ずかしさを回避できる可能性があります。 Spotlight 検索からフォルダを簡単に隠す システム環境設定では、実際には、すぐに使用でき