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

`items.map(&:name)`を機能させる巧妙なハック

配列を反復処理するとき、私が何度も何度も使用していることに気付く速記が1つあります。これは&:トリック、別名「アンパサンドコロン」または「プレッツェルコロン」です。慣れていない場合は、次のように機能します。

words = ["would", "you", "like", "to", "play", "a", "game?"]

# this...
words.map &:length

# ..is equivalent to this:
words.map { |w| w.length }

最近まで、&:構文は演算子だと思っていました。しかし、そうではありません。これは、ActiveSupportで始まり、Ruby1.8.7の公式機能になった巧妙なハックです。

&演算子

AND論理演算に使用されることに加えて、「&」文字はRubyでも別の用途があります。メソッド引数の先頭に追加されると、オペランドでto_procを呼び出し、ブロックとして渡します。それは一口です。例を見る方がはるかに簡単です:

def my_method(&block)
  block.call
end

class Greeter
  def self.to_proc
    Proc.new { "hello" }
  end
end

my_method(&Greeter) # returns "hello"

Symbol#to_proc

to_procを追加できます Symbolを含む任意のオブジェクトへのメソッド。それはまさにルビーが&:を可能にするために行うことです ショートカット。次のようになります:

class Symbol
  def to_proc
    Proc.new do |item|
      item.send self
    end
  end
end

泥のように澄んでいますか?重要な部分はitem.send(self)です 。自己、この場合はシンボルを指します。

すべてをまとめる

eachのような番号付け可能なメソッド およびmap ブロックを受け入れます。アイテムごとに、ブロックを呼び出し、アイテムへの参照を渡します。この場合のブロックは、シンボルでto_procを呼び出すことによって生成されます。

# &:name evaluates to a Proc, which does item.send(:name)
items.map(&:name)

これについて興味深いのは、map これが起こっていることを知りません!作業の大部分は:nameによって行われています シンボル。それは間違いなく賢いです...私の好みにはほとんど賢すぎます。しかし、これはこの時点で何年もの間Rubyの標準ライブラリの一部であり、とても便利なので、今は使用をやめるとは思えません。 :)


  1. Ruby Mapメソッドの使用方法(例付き)

    Mapは、配列、ハッシュ、範囲で使用できるRubyメソッドです。 マップの主な用途は、データを変換することです。 例 : 文字列の配列が与えられた場合、すべての文字列に目を通し、すべての文字を大文字にすることができます。 または、Userのリストがある場合 オブジェクト… 変換できます 対応するメールアドレス、電話番号、またはその他の属性のリストにそれらを追加します Userで定義 クラス。 これを行う方法を正確に見てみましょう! ルビーマップ構文 マップの構文は次のようになります: array = [a, b, c] array.map { |string| string.

  2. 史上最もハイテクなハック!

    テクノロジーは私たちの家をよりスマートにします - 彼らは言いますが、悪意のあるハッカーが家に簡単に侵入できる潜在的なゲートウェイを生成することさえあります.はい、あなたはそれを正しく聞きました!ラップトップを忘れ、ロッカーを忘れました。サイバー犯罪の時代が到来し、繁栄しています。これで、スマート冷蔵庫も手放せなくなります。テレビや洗濯機も。モノのインターネットが、私たちが日常的に使用するすべてのガジェットを管理するための優れた制御を保持しているのも不思議ではありませんが、これらすべての家電製品を使用してサイバー攻撃を仕掛けることができるサイバー犯罪者にとって大きな可能性も秘めています. 今日