是否有比使用自定义案例语句更好的功能性方法来用Ruby编写此方法?

| 想象以下代码:
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
我可以选择其他任何类,我只是以它们为例。我非常喜欢Scala的ѭ1和提取器,我认为这可能是在Ruby中编写相同内容的好方法。有没有一种更好的方式编写上面的代码而不必实例化新对象,这样我就可以调用它们的
===
方法? 只是为了避免不必要的帖子,是的,我知道我可以这样做:
case letter
  when [\"a\",\"e\",\"i\",\"o\",\"u\"].include?(letter)
    # ...
end
    
已邀请:
您可以使用类方法而不是实例方法:
class SimpleLetter
    def self.values
        (\"a\" .. \"z\").to_a
    end 

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

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

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

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

objects.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
    
您不需要字符类。将它们设置为数组,并在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
    
===
也适用于积木:
Letters = (\'a\'..\'z\').to_a
Vowels = [\'a\',\'e\',\'i\',\'o\',\'u\']
Consonants = Letters - Vowels

Vowel = lambda { |x| Vowels.include? x }
Consonant = lambda { |x| Consonants.include? x }

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

objects.each do |object|
  case object
    when Vowel
      puts \"#{object} is a vowel.\"
    when Consonant
      puts \"#{object} is a consonant.\"
    else
      puts \"#{object} is an object.\"
  end
end
    
您的代码使我感到困惑,因为
SimpleLetter
应该是单个字母,而不是整个字母。 尽管进行猴子修补有点冒险,但我还是会半心半意地执行以下操作:
module Voweliness
  def vowel?
    self =~ /[aeiou]/i
  end

  def consonant?
    (self =~ /[a-z]/i and not vowel?)
  end
end

class String
  include Voweliness
end


objects.each do |letter|
  case
    when letter.vowel?
      puts \"#{letter} is a vowel\"
    when letter.consonant?
      puts \"#{letter} is a consonant\"
    else
      puts \"#{letter} is something else\"
  end
end
    
您已经有了几个不错的答案(例如sawa \'s),所以我列出了一个不带
case
陈述的有趣游戏:
SIMPLE_LETTER = [*\"a\" .. \"z\"]
VOWEL        = %w[a e i o u]
CONSONANT    = SIMPLE_LETTER - VOWEL

[*?a..?f,*1..5].each do |letter|
  letter_class = %w(vowel consonant).select { |c| Object.const_get(c.upcase).include? letter}.first
  puts \"\'#{letter}\': #{ letter_class || \"something else\"}\"
end
输出:
\'a\': vowel
\'b\': consonant
\'c\': consonant
\'d\': consonant
\'e\': vowel
\'f\': consonant
\'1\': something else
\'2\': something else
\'3\': something else
\'4\': something else
\'5\': something else
多字符和字符文字仅在1.9中有效。     

要回复问题请先登录注册