ジョギング
日課
- (腕立て x 50 + 腹筋 x 50) x 3
暑い
- もう夏なんぢゃないかと思うくらい暑かった...
野菜
だいぶん野菜が安くなった。
— Yohei Kawahara(かっぱ) (@inokara) 2018年5月16日
昨年末から年始にかけてのあの野菜の値段が高騰したのが嘘のよう...
今日のるびぃ ~ REx - Ruby Examination にチャレンジ (3) ~
REx - Ruby Examination の問題を自分なりにアレンジした上で 1 〜 3 問くらいずつ解いていく. 正直言ってかなり難しい. 尚, irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
mix-in
以下のコードを実行するとどうなるか.
module Mod def c "M#c" end end class Cls include Mod end p Cls.methods.include? :c
false
以下, irb にて確認.
irb(main):001:0> module Mod irb(main):002:1> def c irb(main):003:2> "M#c" irb(main):004:2> end irb(main):005:1> end => :c irb(main):006:0> irb(main):007:0* class Cls irb(main):008:1> include Mod irb(main):009:1> end => Cls irb(main):010:0> irb(main):011:0* p Cls.methods.include? :c false => false
え, なんでやねんってなりそうだけど, 以下の点に注意する必要がある.
include Mod
でモジュールのメソッドを mix-in しているCls.methods
では特異メソッド表示するCls#c
はインスタンスメソッドである為,Cls.methods
の結果には含まれない
以下のように書くと true
となる.
irb(main):013:0> p Cls.new.methods.include? :c true => true
以下のように extend
で mix-in した場合にも true
となる.
irb(main):001:0> module Mod irb(main):002:1> def c irb(main):003:2> "M#c" irb(main):004:2> end irb(main):005:1> end => :c irb(main):006:0> irb(main):007:0* class Cls irb(main):008:1> extend Mod irb(main):009:1> end => Cls irb(main):010:0> irb(main):011:0* p Cls.methods.include? :c true => true
クラスメソッド (特異メソッド)
以下のコードを実行するとどうなるか.
class Cls class << Cls def foo 'foo' end end def foo 'bar' end end p Cls.new.foo
bar
以下, irb にて確認.
(略) irb(main):013:0* p Cls.new.foo "bar" => "bar"
- 特異クラス内
class << Cls; end
で宣言されたメソッドは特異メソッド (クラスメソッド) となる - 特異メソッドは
def Cls.hoge: end
でも宣言することが可能 - 設問では, インスタンスを作成 (
Cls.new
) して, インスタンスメソッド (foo
) を呼び出している
特異メソッドを呼ぶ場合には, 以下のように書く.
irb(main):014:0> p Cls.foo "foo" => "foo"
フムフム.