「class_evalメソッド」

class_evalメソッドという厳ついメソッドを使わざるを得ない場面があった。 初見かつ苦手なモジュール関連のメソッドだったので復習としてまとめておこうと思う。

class_evalメソッドはそもそもRubyの標準クラス・モジュールのメソッドである。

正式には

class_evalメソッドは、ブロックをクラス定義やモジュール定義の中のコードであるように実行します。ブロックの戻り値がメソッドの戻り値になります。 Rubyリファレンス

具体例

class Greet
end

Color.class_eval { def hello; "hello" ;end }

🐤

特異メソッド・特異クラス

クラスメソッド定義方法

①特異メソッド方式

class Dog

  def sef.voice
     p " wan "
  end

end

②特異クラス方式

class Dog
  class<<self

 def voice
   p "wan"
 end

 def bow
   p "bow"
 end
end

ここまでは日常で使うRubyコードのルール的な部分。メタプログラミング的な概念は次回まとめる。🐤

参照:るびま

オブジェクトのprivateメソッド

p , print , putsはObjectクラスのPrivateなメソッド。 よってクラスを定義した時に、Object,Kernel,BasicObjectが継承関係に取り込まれ、レシーバが省略される。

 Object.private_methods.grep(/p/)
=> [:public,
 :protected,
 :private,
 :initialize_copy,
 :prepended,
 :sprintf,
 :loop,
 :Complex,
 :suppress,
 :open_uri_original_open,
 :sleep,
 :polyglot_original_require,
 :respond_to_missing?,
 :open,
 :printf,
 :print,
 :putc,
 :puts,
 :p,
 :initialize_dup,
 :pp,
 :proc,
 :trap,
 :spawn]

🐤

モジュール基礎の基礎

①ミックスイン(include) クラスでモジュールをincludeするとモジュールで定義したメソッドが、インスタンスメソッドとして使える。

module Beep
   def boo
     puts "boo"
   end
 end

 class Car
   include Beep
 end

 class Plane
   include Beep
 end

car = Car.new
car.boo  #=>  "boo"

plane = Plane.new
plane.boo  #=> "boo"

②ミックスイン(extend) extendの場合は、モジュール内のメソッドをクラスメソッド(該当クラスの特異メソッド)として使う事ができるようになる。

module Beep
  def boo
    puts "boo"
  end
 end

module Bump
  def bump
    puts "bump"
  end
end

 class Car
   extend Beep
   extend Bump
 end

 class Plane
    extend Beep
 end

Car.boo  #=>  "boo"
Car.bump #=>  "Bump"
Plane.boo  #=> "boo"

名前空間とか、難しいやつは次回🐤

git remote先を変更したい時

どのくらいの頻度でリモート先を変える事があるか分からないが、butibucketとgithubリポジトリが存在し、push先を変更したい時には、

1.現在のリモート先を確認

git remote -v

2.新しいリポジトリurlへ変更

git remote set-url origin {new~url}

3.変更確認

git remote -v

たったこれだけ。🐤