Project

General

Profile

Actions

Feature #14916

open

Proposal to add Array#===

Added by osyo (manga osyo) over 5 years ago. Updated over 5 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-dev:50593]

Description

概要

Array#=== を追加する提案になります。
基本的な動作は『Array#===== で比較する版』になります。

仕様

配列の各要素をそれぞれ順に === で比較し、全要素が true の場合に true を返す。そうでない場合は false を返す。

動作例

# 配列の各要素を #=== を使用して比較する
[ String, /\w/ ]          === [ "a", "c", 7 ]   # => false
[ String, /\w/, (1..10) ] === [ "a", "c", 7 ]   # => true
[ String, /\w/, (1..10) ] === [ "a", "!", 42 ]  # => false

真を返すケース

  • レシーバと引数が配列で同じサイズかつ、各要素を === で比較したときに全て true になる場合
  • レシーバと引数が同じオブジェクトの場合

偽を返すケース

  • レシーバと引数が配列で同じサイズかつ、各要素を === で比較したときに false がある場合
  • レシーバと引数の配列のサイズが異なる場合
  • 引数が配列以外の場合

ユースケース

引数の値によって処理を変える

可変長引数で引数を受け取り、そのまま case-when で値を精査する

def plus *args
  case args
  # 数値の場合
  when [Integer, Integer]
    args[0] + args[1]
  # 数字の場合
  when [/^\d+$/, /^\d+$/]
    args[0].to_i + args[1].to_i
  # それ以外はエラー
  else
    raise "Error"
  end
end

p plus 1, 2
# => 3
p plus "3", "4"
# => 7
p plus "homu", "mado"
# Error (RuntimeError)

FizzBuzz を用いた例

任意の処理の結果を複数回参照したい場合、配列でまとめて case-when で利用する

def fizzbuzz n
  _ = proc { true }
  case [n % 3, n % 5]
  # n % 3 === 0 && n % 5 === 0
  when [0, 0]
    "FizzBuzz"
  # n % 3 === 0
  when [0, _]
    "Fizz"
  # n % 5 === 0
  when [_, 0]
    "Buzz"
  else
    n
  end
end

p (1..20).map &method(:fizzbuzz)
# => [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]

関連しそうなチケット

以上、 Array#=== に関する提案になります。
挙動に関して疑問点や意見などございましたらコメント頂けると助かります。


Files

array_eqq.patch (3.06 KB) array_eqq.patch `===` で比較するだけ osyo (manga osyo), 07/17/2018 04:54 PM
array_eqq.patch (3.2 KB) array_eqq.patch `===` と `==` で比較する osyo (manga osyo), 08/08/2018 01:19 PM
array_eqq.patch (3.41 KB) array_eqq.patch Support `to_ary` osyo (manga osyo), 08/09/2018 02:22 AM

Related issues 2 (1 open1 closed)

Related to Ruby master - Feature #14869: Proposal to add Hash#===OpenActions
Related to Ruby master - Feature #14913: Extend case to match several values at onceClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0