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

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の潜在的に有用な機能ですが、これまで使用したことがない場合は、少し注意が必要です。


  1. Rubyでの挿入ソートを理解する

    注:これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート4です。パート1ではバブルソート、パート2では選択ソート、パート3ではマージソートについて説明しました。 データを並べ替えるためのさまざまな方法を引き続き検討するため、挿入並べ替えに目を向けます。挿入ソートが好きな理由はたくさんあります!まず、挿入ソートは安定です。 、これは、等しいキーを持つ要素の相対的な順序を変更しないことを意味します。 インプレースアルゴリズムでもあります 、は、並べ替えられた要素を格納するための新しい配列を作成しないことを意味します。最後に、挿入ソートは、すぐにわかるように、実

  2. Ruby Freezeメソッド–オブジェクトの可変性を理解する

    オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー