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

7つの興味深いRubyコード例

新しいRubyのトリック、パターン、メソッドを学ぶ1つの方法は、他の人が書いたコードを読むことです。

しかし、読む価値のある興味深いコードはどこにありますか ?

多くのオープンソースプロジェクトとコーディングチャレンジサイトがあり、独自のプロジェクトを提出すると、他の開発者からのソリューションを見ることができます。

この記事の内容

きっと楽しめると思う7つの例をまとめました。

また、これを最大限に活用するために、各例についていくつかの解説を提供します。

2つの数値の合計

この例では、一意の番号の配列が与えられているかどうかを調べたいのですが、2つの番号の組み合わせがあり、合計するとターゲット番号になります。

コード

def sum_eq_n?(arr, n)
  return true if arr.empty? && n == 0

  arr.product(arr).reject { |a,b| a == b }.any? { |a,b| a + b == n }
end

product を使用しているので、これは興味深いことです ここでの方法。

この方法を使用する場合、配列Aのすべての値と配列Bのすべての値を組み合わせるループ内にループがあるようなものです。

カウント、マッピング、検索

(2,4,6,10)のように、等差数列で欠落している数値を見つけたいとします。 。

数値の差を計算する戦略を使用できます。

[2, 2, 4]

ここでの私たちの目標は、シーケンスが何であるかを見つけることです。

増加していますか、それとも減少していますか?

いくらですか?

このコードはシーケンスを明らかにします:

differences = [2, 2, 4]

differences.max_by { |n| differences.count(n) }
# 2
# This is the increase between numbers in the sequence

シーケンスがわかれば、すべての番号を比較して、欠落している番号を見つけることができます。

コードは次のとおりです

def find_missing(sequence)
  consecutive     = sequence.each_cons(2)
  differences     = consecutive.map { |a,b| b - a }
  sequence        = differences.max_by { |n| differences.count(n) }

  missing_between = consecutive.find { |a,b| (b - a) != sequence }

  missing_between.first + sequence
end

find_missing([2,4,6,10])
# 8

ここでハードワークを行うために使用しているRubyメソッドの数を数えます🙂

正規表現の例

文字列を操作していて、パターンを見つけたい場合は、正規表現が最適です。

それらを正しく理解するのは少し難しいかもしれませんが、練習することで習得できます!

特定の文字列がVOWELからNON-VOWEL文字のパターンに従っているかどうかを調べたいとします。

このように

"ateciyu"

次に、 match?とともに正規表現を使用できます。 これを理解する方法。

コード例は次のとおりです

def alternating_characters?(s)
  type = [/[aeiou]/, /[^aeiou]/].cycle

  if s.start_with?(/[^aeiou]/)
    type.next
  end

  s.chars.all? { |ch| ch.match?(type.next) }
end

alternating_characters?("ateciyu")
# true

いくつかの点に注意してください

  1. サイクルを使用します VOWEL正規表現とNON-VOWEL正規表現を切り替え続けることができるようにする方法。
  2. 文字列をcharsを使用して文字の配列に変換します all?を使用できるようにします メソッド。

再帰とスタックの例

再帰とは、ソリューションに向けて前進する方法として、メソッドがそれ自体を複数回呼び出す場合です。

多くの興味深い問題は再帰で解決できます

ただし、再帰には制限があるため、代わりにスタックデータ構造を使用できます。

特定のアレイの「べき集合」を調べたい例を見てみましょう。べき集合は、アレイから作成できるすべてのサブセットのセットです。

再帰の例を次に示します

def get_numbers(list, index = 0, taken = [])
  return [taken] if index == list.size

  get_numbers(list, index+1, taken) +
  get_numbers(list, index+1, taken + [list[index]])
end

get_numbers([1,2,3])

スタックを使用して解決された同じ問題があります

def get_numbers_stack(list)
  stack  = [[0, []]]
  output = []

  until stack.empty?
    index, taken = stack.pop

    next output << taken if index == list.size

    stack.unshift [index + 1, taken]
    stack.unshift [index + 1, taken + [list[index]]]
  end

  output
end

ここでの考え方は、アルゴリズムの各パスで、数値を取得するか、取得しないかのいずれかであるということです。

可能なすべての組み合わせを作成できるように、両方の結果を分岐して試してみます 。

各葉が解決策の1つである木を想像してみてください。

注意事項

  1. 再帰ソリューションはより短いです
  2. アルゴリズムの実際の「進行中」の部分(インデックス+ 1)はほぼ同じです
  3. Stack がないため、使用しているスタックは単なる配列です。 Rubyのクラス

メソッドチェーンの例

これは、Rubyがいかに強力であるかを示しているので私のお気に入りの例です。

メソッドを組み合わせると、あるメソッドで生成された出力を取得して別のメソッドに渡すことができます。 。

工場の生産ラインのように!

いくつかの原材料(入力)から始めて、これらのメソッドを呼び出すプロセスを通じて、原材料をゆっくりと目的の結果に変換します。

ここに例があります

def longest_repetition(string)
  max = string
          .chars
          .chunk(&:itself)
          .map(&:last)
          .max_by(&:size)

  max ? [max[0], max.size] : ["", 0]
end

longest_repetition("aaabb")
# ["a", 3]

文字列を指定すると、このコードは最も長い繰り返し文字を検索します 。

  • 読みやすさを最大化するためにこのコードをフォーマットする方法
  • Symbol#to_procの使用 パターン(&:size

ところで、これを「デメテルの法則」と混同しないでください。

その「法則」とは、別のオブジェクトの内部に手を差し伸べることです。

ここでは、オブジェクトのみを変換しています。

インデックスの例を使用

アイテムのコレクションを反復処理しながら、現在のインデックスを取得しますか?

with_indexを使用できます メソッド。

ここに例があります

def reverse_alternate(string)
  string.gsub(/[^\s]+/).with_index { |w, idx| idx.even? ? w : w.reverse }
end

reverse_alternate("Apples Are Good")
# "Apples erA Good"

通知

  • with_indexを組み合わせます &でも? 現在の単語を逆にする必要があるかどうかを確認する
  • ブロックのないGsubは、列挙子を返します オブジェクト。他のメソッドとチェーンすることができます

各オブジェクトの例

もう1つの興味深いメソッドは、 each_with_objectです。 、およびその友人 with_object

結果を保持するオブジェクトが必要な場合は、これら2つのメソッドを使用できます。

ここに例があります

def clean_string(str)
  str
    .chars
    .each_with_object([]) { |ch, obj| ch == "#" ? obj.pop : obj << ch }
    .join
end

clean_string("aaa#b")

この例では、が見つかったときに、最後の文字を削除します。 シンボル。

通知

  • each_with_object 引数を取ります。これは、最初に使用するオブジェクトです。この引数は2番目のブロックパラメータになります。
  • 文字列を文字の配列に変換しています( char )そして、完了したら文字列に戻ります( join
  • 三項演算子を使用して何をするかを決定しています。これにより、コードが短くなります。

概要

この記事では、より良いRubyコードを書くのに役立つ、私の解説と説明を含むいくつかの興味深いコード例を見てきました。

より多くの人が楽しめるように、この記事を共有することを忘れないでください。

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


  1. Rubyでファイルを読み書きする方法(例付き)

    今日は、Rubyでファイルを読み書きして、コンテンツを抽出し、新しいファイルを作成し、必要な情報を見つける方法を学びます。 これから説明します : コンテンツ 1Rubyでファイルを読み取る方法 2Rubyでファイルに書き込む方法 3つのRubyファイルメソッド 4つのディレクトリ操作 5FileUtilsモジュールの使用方法 6まとめ 6.1関連 やってみましょう! Rubyでファイルを読み取る方法 次のようにRubyでファイルを読み取ることができます: ファイルを開く 、open メソッド。 ファイルを読む 、ファイル全体、行ごと、または特定のバイト数。 ファイルを

  2. Rubyの配列クラスの使用方法(例+便利なメソッド)

    アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ