ナスカブログ

未来の自分へのドキュメント

Ruby Goldへの道 day14

以下のサイトでruby gold取得に向けて毎日一回Goldチャレンジを行い間違えた問題を簡単にまとめる。 rex.libertyfish.co.jp

14日目 得点 82点/100点中

  • include, extend
    • includeしたモジュール内のメソッドはインスタンスメソッドとして呼び出すことができる
    • extendしたモジュール内のメソッドはクラスメソッドとして呼び出すことができる
module M
  def class_m
    "class_m"
  end
end

class C
  include M
  # Mモジュールないのメソッドをインスタンスメソッドとして呼び出すことができる
end

p C.methods.include? :class_m #=> false
p C.new.methods.include? :class_m #=> true
p C.new.class_m #=> "class_m"
p C.class_m #=> undefined method `class_m' for C:Class (NoMethodError)
  • lambdaは引数が合っていないとArgumentErrorを返す
  • procは引数の足りない分はnilで補完する
local = 0

p1 = lambda { |arg1, arg2|
  arg1, arg2 = arg1.to_i, arg2.to_i
  local += [arg1, arg2].max
}

p1.call("1", "2")
p1.call("7", "5")
p1.call("9")

p local
#=>  wrong number of arguments (given 1, expected 2) (ArgumentError)
  • Objectクラスにメソッドを定義すると特異クラスでもそのメソッドを利用することができる
class Object
  CONST = "1"
  def const_succ
    CONST.succ!
  end
end

class Child1
  const_succ # "2"になる
  class << self
    const_succ # "3"になる
  end
end

class Child2
  const_succ # "4になる"
  def initialize
    const_succ
  end
end

Child1.new # "4"のまま
Child2.new # "5"になる

p Object::CONST

class Object CONST = "1" def const_succ CONST.succ! end end

class Child1 p const_succ #=> "2" class << self p const_succ #=> "3" end end

class Child2 p const_succ #=> "4" def initialize p const_succ #=> "5" end end

Child1.new Child2.new

p Object::CONST