Rubyの改良と語彙スコープを理解する
これまでに改良を使用したことがない場合は、おそらく驚きに満ちています。モンキーパッチの代わりに改良が加えられたと聞いたことがあるかもしれません。したがって、ActiveSupportのhours
のようなものを実装できると期待するかもしれません。 方法:
module TimeExtension
refine Fixnum do
def hours
self * 60
end
end
end
class MyFramework
using TimeExtension
end
class MyApp < MyFramework
def index
1.hours
end
end
MyApp.new.index # undefined method `hours' for 1:Fixnum (NoMethodError)
上記のコードを実行すると、機能しないことがわかります。では、何が得られるのでしょうか?
他の多くの優れたアイデアと同様に、冷酷な現実で機能させるには、改良の元の概念を微調整する必要がありました。
上で見たコードの驚くべき動作は、これらの調整の1つが原因です。具体的には、改良は字句スコープであるというルールです。
字句スコープとは何ですか?
何かが語彙的であると言うとき、それはテキストに関係していることを意味します—そのコードが意味するものとは対照的に、画面上のコード。
2行が字句スコープである場合、それは単に、そのコードブロックが何に評価されるかに関係なく、同じコードブロック内で発生することを意味します。
例について話すよりも、例を見る方がはるかに簡単です:
class B
# x and y share the same lexical scope
x = 1
y = 1
end
class B
# z has a different lexical scope from x and y, even though it's in the same class.
z = 3
end
usingキーワードを使用して絞り込みを適用すると、絞り込みは字句スコープ内でのみ表示されます。
これが私の意味を示す例です:
module TimeExtension
refine Fixnum do
def hours
self * 60
end
end
end
class MyApp
using TimeExtension
def index
1.hours
end
end
class MyApp
def show
2.hours
end
end
MyApp.new.show # undefined method `hour' for 1:Fixnum (NoMethodError)
両方のindex
およびshow
メソッドは同じクラスの一部であり、index
のみです。 メソッドは、using
と字句スコープを共有するだけなので、改良にアクセスできます。 ステートメント。
Rubyの他のほとんどすべてが動的にスコープされているため、これはおそらく少し奇妙に思えます。クラスにメソッドを追加すると、クラス定義を終了してもメソッドはそこにとどまります。しかし、それは改良がどのように機能するかではありません。
これは、最初は明らかではないかもしれない多くの結果です。
send
メソッドは、usingステートメントを含む同じコードブロック内で定義されていないため、絞り込みを確認できません。
したがって、これは機能しません:
class MyApp
using TimeExtension
def index
1.send(:hours)
end
end
respond_to?
メソッドも同じコードブロック内にありません。したがって、send
と同じ理由で機能しません メソッドはしません。
class MyApp
using TimeExtension
def index
1.respond_to?(:hours)
end
end
これにより、人々が洗練について持っているのを見た混乱の一部が解消されることを願っています。これらは間違いなくRubyの潜在的に有用な機能ですが、これまで使用したことがない場合は、少し注意が必要です。
-
Rubyでの挿入ソートを理解する
注:これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート4です。パート1ではバブルソート、パート2では選択ソート、パート3ではマージソートについて説明しました。 データを並べ替えるためのさまざまな方法を引き続き検討するため、挿入並べ替えに目を向けます。挿入ソートが好きな理由はたくさんあります!まず、挿入ソートは安定です。 、これは、等しいキーを持つ要素の相対的な順序を変更しないことを意味します。 インプレースアルゴリズムでもあります 、は、並べ替えられた要素を格納するための新しい配列を作成しないことを意味します。最後に、挿入ソートは、すぐにわかるように、実
-
Ruby Freezeメソッド–オブジェクトの可変性を理解する
オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー