有没有比使用自定义case语句更实用的方法在Ruby中编写它?

Geo*_*Geo 3 ruby functional-programming scala extractor

想象一下以下代码:

class SimpleLetter
  def values
    ("a" .. "z").to_a
  end

  def ===(other)
    values.include?(other)
  end
end

class Vowel < SimpleLetter
  def values
    ["a","e","i","o","u"]
  end
end

class Consonant < SimpleLetter
  def values
    super - Vowel.new.values
  end
end

objects = ("a" .. "f").to_a + (1 .. 5).to_a

objects.each do |letter|
  case letter
    when Vowel.new
      puts "#{letter} it's a vowel"
    when Consonant.new
      puts "#{letter} it's a consonant"
    else
      puts "#{letter} it's something else"
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以选择任何其他类,我只是以它们为例.我非常喜欢Scala match和提取器,我认为这可能是在Ruby中编写相同内容的好方法.有没有更好的方法来编写上面的内容而不必实例化新对象只是为了我可以调用他们的===方法?

只是为了避免不必要的帖子,是的,我知道我可以这样做:

case letter
  when ["a","e","i","o","u"].include?(letter)
    # ...
end
Run Code Online (Sandbox Code Playgroud)

saw*_*awa 5

您不需要角色的类.将它们设置为数组,并在case语句中使用splat运算符.

SimpleLetter = ("a" .. "z").to_a
Vowel        = %w[a e i o u]
Consonant    = SimpleLetter - Vowel

(("a" .. "f").to_a + (1 .. 5).to_a).each do |letter|
  case letter
    when *Vowel
      puts "#{letter} it's a vowel"
    when *Consonant
      puts "#{letter} it's a consonant"
    else
      puts "#{letter} it's something else"
  end
end
Run Code Online (Sandbox Code Playgroud)