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をご覧ください。
より多くの人に見てもらえるように、この投稿を友達と共有していただければ幸いです。
読んでくれてありがとう!
-
Rubyエイリアスキーワードの使用方法
Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin
-
Spotlight 検索からフォルダーを非表示にする
個人の財務書類であろうと、他のものであろうと、他の人に見られたくないファイルやフォルダが Mac にあることは誰にでもあります。これらのファイルが他のユーザーに表示される方法の 1 つは、Mac のツールバーからアクセスできる Apple の組み込みシステム全体の検索である Spotlight 検索を使用することです。幸いなことに、Spotlight 検索で特定のフォルダーが表示されないようにする方法がいくつかあります。これにより、個人情報の盗難や恥ずかしさを回避できる可能性があります。 Spotlight 検索からフォルダを簡単に隠す システム環境設定では、実際には、すぐに使用でき