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日
つぎ、(関数的)メソッドの定義
def hello(name)
puts "hello #{name}"
end
hello("Ruby")
➜ ruby hello_with_name.rb
hello Ruby
関数的メソッドの定義、既におなじみ。
Green_helmet@bethlehem4099·7月18日
デフォルト付き関数的メソッドの定義
def hello(name="Ruby")
puts "hello #{name}"
end
hello()
hello("Ractor")
➜ ruby hello_with_default.rb
hello Ruby
hello Ractor
デフォルト付き関数的メソッドの定義、はい。
Green_helmet@bethlehem4099·7月18日
メソッドからの戻り値(独自作成)
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)
➜ ruby return_value.rb
0
nil
2
メソッドからの戻り値(独自作成)。
そう、Rubyだとスッキリ書けるね
Green_helmet@bethlehem4099·7月18日
ブロック付きメソッドの定義
def my_loop
while true
yield
end
end
num=1
my_loop do
puts "num=#{num}"
break if num>2
num *=2
end
➜ ruby my_loop.rb
num=1
num=2
num=4
ええっ、これは何!?
Rubyの予約語で謎だった yield の正体…
Rubyではプログラムを引数として渡すことができ、それを実行できるの!?
これすごい。
Green_helmet@bethlehem4099·7月19日午前7:55
つぎ引数(ひきすう)の数が不定のメソッド
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)
➜ ruby args.rb
[1, 2, 3]
[4, [5, 6]]
[7, [8, 9], 10]
引数(ひきすう)の数が不定のメソッド。はい。
Green_helmet@bethlehem4099·7月20日
つぎ、rubyではポインタを使えるのか?
脱線だが、やってみた。
Green_helmet@bethlehem4099·7月21日
a=[1,2,4,5]
p a
p *a
p &a
➜ 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日
キーワード引数
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)
➜ ruby keyword_argmnets.rb
52
52
16
キーワード引数。はい、よくできています。
定義に存在しないキーワードを**変数名で受け取ることができる。はい。
これでメソッドは終わり。どっとはらい。
Green_helmet@bethlehem4099·7月21日