「たのしいRuby」メソッド

Rubyの本、買ってきた。「たのしいRuby」勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。今回はメソッド、他のコンピュータ言語では関数と言う。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)

***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. インスタンス）
１ページに知らない単語が３つあると話が宇宙猫になる法則
***Green_helmet@bethlehem4099·7月18日***
## つぎ、（関数的）メソッドの定義
~~~Ruby:hello_with_name.rb
def hello(name)
    puts "hello #{name}"
end

hello("Ruby")
~~~
~~~command_line:command_line
➜  ruby hello_with_name.rb
hello Ruby
~~~
関数的メソッドの定義、既におなじみ。
***Green_helmet@bethlehem4099·7月18日***
## デフォルト付き関数的メソッドの定義
~~~Ruby:hello_with_default.rb
def hello(name="Ruby")
    puts "hello #{name}"
end

hello()
hello("Ractor")
~~~

~~~commnd_line:command_line
➜  ruby hello_with_default.rb
hello Ruby
hello Ractor
~~~
デフォルト付き関数的メソッドの定義、はい。
***Green_helmet@bethlehem4099·7月18日***
## メソッドからの戻り値(独自作成)
~~~Ruby: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:command_line
➜  ruby return_value.rb
0
nil
2
~~~
メソッドからの戻り値(独自作成)。
そう、Rubyだとスッキリ書けるね
***Green_helmet@bethlehem4099·7月18日***

## ブロック付きメソッドの定義
~~~Ruby: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:command_line
➜  ruby my_loop.rb
num=1
num=2
num=4
~~~

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

## つぎ引数(ひきすう)の数が不定のメソッド
~~~Ruby: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_;ine: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日***
~~~Ruby:pointer.rb
a=[1,2,4,5]
p a
p *a
p &a
~~~
~~~command_line: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日***


## キーワード引数
~~~Ruby: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:command_line
➜  ruby keyword_argmnets.rb
52
52
16
~~~
キーワード引数。はい、よくできています。
定義に存在しないキーワードを**変数名で受け取ることができる。はい。

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