Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | ライブラリ | Enumerable

パンくず

Ruby
ライブラリ
Enumerable

概要

Rubyの組み込みライブラリのEnumerableモジュールについて

Enumerableモジュール概要

繰り返しを行なうクラスのための Mix-in。
このモジュールの メソッドは全て each を用いて定義されているので、
インクルード するクラスには each が定義されていなければならない。

Enumerableの各メソッドのサンプル

# encoding: Windows-31J
require "pp"

class ProgrammingLanguage
  attr_accessor:name
  def initialize(name);@name=name;end
end

class ProgrammingLanguages
  include Enumerable # =>EnumerableをMix-in
  attr_accessor:language_list
  def initialize;@language_list = Array.new;end
  
  def add_language(language);@language_list.push(ProgrammingLanguage.new(language));end

  # Enumerable用にeachを実装
  def each
    @language_list.each do |language|
      yield language
    end
  end
end

def print_all_language_name(programming_languages)
  programming_languages.each {|language|print language.name,","}
  puts ""
end

programming_languages = ProgrammingLanguages.new

puts "■all?メソッド"
%w[VB Java Ruby].each {|language|programming_languages.add_language language}
print_all_language_name programming_languages
ret = programming_languages.all? {|language|language.name.length >= 2} # => すべての要素の言語名が2文字以上なら真
puts "すべての言語名が2文字以上か=#{ret}"

programming_languages.add_language "C"
print_all_language_name programming_languages
ret = programming_languages.all? {|language|language.name.length >= 2} # => Cが1文字なので偽を返却
puts "すべての言語名が2文字以上か=#{ret}"

puts "■any?メソッド"
ret = programming_languages.any? {|language|language.name == "JavaScript"} # => すべての要素にJavaScriptが含まれていないなら偽
puts "すべての要素にJavaScriptが含まれていないなら真=#{ret}"

programming_languages.add_language "JavaScript"
print_all_language_name programming_languages
ret = programming_languages.any? {|language|language.name.length >= 2} # => JavaScriptを追加したので真を返却
puts "すべての要素にJavaScriptが含まれていないなら真=#{ret}"

puts [1,3,5,7].inject(0) {|result, number|result + number} # 総和を求める。0はresultの初期値
puts [1,3,5,7].inject(:+) # 上記と同等
puts [1,3,5,7].reduce(:+) # 上記と同等

出力

■all?メソッド
VB,Java,Ruby,
すべての言語名が2文字以上か=true
VB,Java,Ruby,C,
すべての言語名が2文字以上か=false
■any?メソッド
すべての要素にJavaScriptが含まれていないなら真=false
VB,Java,Ruby,C,JavaScript,
すべての要素にJavaScriptが含まれていないなら真=true
16
16
16