sendメソッドについて

f:id:ryoutaku_jo:20190426221128p:plain

【結論】

・sendメソッドとは、レシーバーの持っている
 メソッドを呼び出すメソッド

・第二引数に指定した値を
 呼び出したメソッドの引数に渡す事も出来る

・呼び出したいメソッドを変数で指定して
 条件分岐させる際などに有用である

【目次】

【本題】

sendメソッドについて

sendメソッドとは、
レシーバーの持っているメソッドを呼び出す為のメソッドです。

#Fruitクラスと、そのインスタンスメソッドのappleを定義する
class Fruit
  def apple
    puts "2万円です"
  end
end

#Fruitクラスのインスタンスを生成する
fruit = Fruit.new

# レシーバであるfruitが持っているメソッドのappleを呼び出す
fruit.send(:apple)
=> 2万円です

第二引数でメソッドの引数を指定可能

また、sendメソッドは、第二引数に値を指定すると、
呼び出したメソッドの引数に渡す事も出来ます。

#Fruitクラスと、そのインスタンスメソッドのappleを定義する
class Fruit
  def apple(money)
    puts "#{money}万円です"
  end
end

#Fruitクラスのインスタンスを生成する
fruit = Fruit.new

# レシーバであるfruitが持っているメソッドのappleを呼び出す
fruit.send(:apple, 100)
=> 100万円です

利用シーン

sendメソッドは、呼び出したいメソッドを
変数で指定したい場合に有用です。

class Fruit
  def apple
    puts "20円です"
  end

  def melon
    puts "100円です"
  end
end

fruit = Fruit.new

favorite_color = "red"
favorite_food = favorite_color == 'red' ? 'apple' : 'melon'

# 変数でメソッドを呼び出す事が可能
fruit.send(favorite_food)
=> 20円です

# 直接メソッドを実行する場合、変数は指定出来ない
fruit.favorite_food
=> NoMethodError: undefined method `favorite_food'

これにより出力したい内容を条件分岐させたり、
コードを共通化させる際に役立ちます。

なお、呼び出すメソッドが決まっている場合は
記述が冗長になるので、利用は控えた方が良いと考えています。

#直接メソッドを実行する場合
fruit.apple
=> 2万円です

# sendメソッドの場合
fruit.send(:apple)
=> 2万円です

参考情報

send (Object) - Rubyリファレンス

【Ruby on Rails】sendメソッドのいろんな書き方 - Qiita

《今日の学習進捗(3年以内に10000時間に向けて)》

・業務でのCKEditorの導入がひとまず完了したが、
 やはり仕様を把握しきれず、ブラックボックスな箇所が多い。
 リファレンスは読み込んだが、フロント周りの知識(npmやyarn)が欠けている事と
 英語の読解力が足りていない事が影響していると考えている。
 今回のGWは長期間なので、個人アプリ開発を行って、その中で
 CKEditorを取り込んで、休み明けまでに理解を深めておきたい。

・社内の勉強会にて、TDDに概要を学んだが、実践のハードルが高いと感じた。
 テストコードから書き始めるには、全体の設計を細部まで想定する必要があるが、
 まだ通常の開発自体不慣れな為、手戻りが多くなる印象を受けた。
 しかし利点は非常に感じたので、お勧めの書籍などを機会をみて読んで、
 実際の開発に組み込むことを試してみたい。

学習開始からの期間 :140日
今日までの合計時間:1347h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1279h
目標との解離:68h
「10,000時間」まで、

残り・・・「8653時間!」