4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyAdvent Calendar 2022

Day 16

「たのしいRuby」メソッド

Last updated at Posted at 2022-12-16

Rubyの本、買ってきた。「たのしいRuby」勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。今回はメソッド、他のコンピュータ言語では関数と言う。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon

参考文献

この記事は以下の情報を参考にして執筆しました。
-たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年
-『たのしいRuby 第6版』サポートページ、ソースコード

Green_helmet@bethlehem4099·7月17日

メソッド呼び出し

以下「たのしいRuby」から引用

単純なメソッド呼び出し

オブジェクト.メソッド名(引数1,引数2, …, 引数n)

ブロック付きメソッド呼び出し

オブジェクト.メソッド名(引数, … ) do |変数1,変数2, …|
ブロックの内容
end

オブジェクト.メソッド名(引数, … ) { |変数1,変数2, …|
ブロックの内容
}

メソッド呼び出しのパターン、ふむ。まあこのパターンは今まで散々使ってきたからね、その通り。do end を { } で置き換えられる。はい。
Green_helmet@bethlehem4099·7月17日

演算子の形式のメソッド呼び出し

以下「たのしいRuby」から引用

obj + arg1
obj =~ arg1
-obj
!obj
obj[arg1]
obj[arg1] = arg2

objはレシーバとも呼ばれる。詳細は別途。
Green_helmet@bethlehem4099·7月17日

メソッドの分類

✅オブジェクト(インスタンス)をレシーバとするメソッドをインスタンスメソッドという(意訳)
✅クラスをレシーバとするメソッドをクラスメソッドという(意訳)
✅レシーバを省略しているメソッドを関数メソッドという(意訳)

この項、全くわからなかった。自分なりに意訳したがあっているのか?メソッドの説明に使っている用語がオブジェクト指向の用語で、それはまだ正式には説明されてない(仮に知っていても微妙に用語の意味が違うっぽい、ex. インスタンス)
1ページに知らない単語が3つあると話が宇宙猫になる法則
Green_helmet@bethlehem4099·7月18日

つぎ、(関数的)メソッドの定義

hello_with_name.rb
def hello(name)
    puts "hello #{name}"
end

hello("Ruby")
command_line
➜  ruby hello_with_name.rb
hello Ruby

関数的メソッドの定義、既におなじみ。
Green_helmet@bethlehem4099·7月18日

デフォルト付き関数的メソッドの定義

hello_with_default.rb
def hello(name="Ruby")
    puts "hello #{name}"
end

hello()
hello("Ractor")
command_line
➜  ruby hello_with_default.rb
hello Ruby
hello Ractor

デフォルト付き関数的メソッドの定義、はい。
Green_helmet@bethlehem4099·7月18日

メソッドからの戻り値(独自作成)

return_value.rb
def return_value(x)
    case x
        when 0
            return x
        when 1
            return
        else
            x
        end
end

p return_value(0)
p return_value(1)
p return_value(2)
command_line
➜  ruby return_value.rb
0
nil
2

メソッドからの戻り値(独自作成)。
そう、Rubyだとスッキリ書けるね
Green_helmet@bethlehem4099·7月18日

ブロック付きメソッドの定義

my_loop.rb
def my_loop
    while true
        yield
    end
end

num=1
my_loop do
    puts "num=#{num}"
    break if num>2
    num *=2
end
command_line
➜  ruby my_loop.rb
num=1
num=2
num=4

ええっ、これは何!?
Rubyの予約語で謎だった yield の正体…
Rubyではプログラムを引数として渡すことができ、それを実行できるの!?
これすごい。
Green_helmet@bethlehem4099·7月19日午前7:55

つぎ引数(ひきすう)の数が不定のメソッド

args.rb
def foo(*args)
    args
end

def mes(arg, *args)
    [arg,args]
end

def a(a,*b,c)
    [a,b,c]
end

p foo(1,2,3)
p mes(4,5,6)
p a(7,8,9,10)
command_line
➜  ruby args.rb
[1, 2, 3]
[4, [5, 6]]
[7, [8, 9], 10]

引数(ひきすう)の数が不定のメソッド。はい。

Green_helmet@bethlehem4099·7月20日

つぎ、rubyではポインタを使えるのか?

脱線だが、やってみた。

Green_helmet@bethlehem4099·7月21日

pointer.rb
a=[1,2,4,5]
p a
p *a
p &a
command_line
➜  ruby pointer.rb
[1, 2, 4, 5]
1
2
4
5
pointer.rb:5:in `<main> `: wrong argument type Array (expected Proc) (TypeError)

ふむ、Rubyではポインタは使えないみたいだ。
あと、*aは要素を取り出しているみたいだな。

Green_helmet@bethlehem4099·7月21日

キーワード引数

keyword_argments.rb
def area(x:0, y:0, z:0)
    xy=x*y
    yz=y*z
    zx=z*x
    (xy+yz+zx)*2
end

p area(x:2, y:3, z:4)
p area(y:3, z:4, x:2)
p area(x:2, z:4)
command_line
➜  ruby keyword_argmnets.rb
52
52
16

キーワード引数。はい、よくできています。
定義に存在しないキーワードを**変数名で受け取ることができる。はい。

これでメソッドは終わり。どっとはらい。
Green_helmet@bethlehem4099·7月21日

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?