Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@akilax

define_methodってどんなmethod?

define_methodってどんなmethod?

gemを読んでいたらdefine_methodなるメソッドが出てきたけど、
よくわからなかったので調べてみた。
直訳するとmethodを定義する。って名前のメソッド。
ますますわからない。。

ということで例をみてみます。

ruby.rb
NUMBERS = %w(zero one two three four five six seven eight nine)

NUMBERS.each_with_index do |word, num|
  define_method word do |i = nil|
    i ? num * i : num
  end
end

p two      #=> 2
p two(2)   #=> 4
p nine     #=> 9
p nine(3)  #=> 27

define_methodはmethodを動的に定義できるメソッドです
上記の例でもtwoやnineと言ったメソッドは直接定義したわけではないけれど
メソッドとして使えることができます。
これはdefine_methodによって動的にtwo,nineメソッドが定義されたからです。

ruby.rb
NUMBERS.each_with_index do |word, num|
  define_method word do |i = nil|
    i ? num * i : num
  end
end

define_methodの引数にwordが渡されています。
これが動的に定義されるメソッド名となります。
wordには["zero","one","two",..."nine"]という配列の要素が入っていきます。
なのでtwo,nineというメソッドが使えました。

そしてdefine_methodのブロック部分が動的に定義されるメソッドの処理内容となります。

ruby.rb
define_method word do |i = nil|
    i ? num * i : num
  end

内容としてはiが存在するときはi * numを返し、
存在しないときはnumを返すということですね。

そしてiは新たに定義されるメソッドの引数に当たっています。
最後に処理結果をもう一度見てみましょう。

p two      #=> 2 #引数がないのでnumを返す
p two(2)   #=> 4 #引数があるので 2 * 2 = 4
p nine     #=> 9 #引数がないのでnumを返す
p nine(3)  #=> 27 #引数があるので 9 * 3 = 27

define_methodの説明はここまでです。
お役に立てたら幸いです。

一人前のエンジニアになるまであと86日

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
akilax
営業社員からエンジニアになりました。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?