【Ruby学習記録】メソッドといろいろな引数
お題1:下記のコードの introduce メソッドを拡張し、以下の条件を満たす内容を実装せよ
def introduce
name = "三郎"
live = "宮崎"
end
result = introduce
puts result
- プログラムを実行すると以下のように出力される
私は宮崎に住んでいる三郎です
- 戻り値は 1 で期待している文字列
解答
def introduce
name = "三郎"
live = "宮崎"
return "私は#{live}に住んでいる#{name}です。"
end
result = introduce
puts result
ポイントは Ruby でのメソッドの実装の仕方。def メソッド名 ~ end
で囲んだ範囲がメソッドとなる。
また、当初のコードだと変数に値を設定しているだけで終わっているため、result = introduce
としても何も返ってこない。
なので、メソッドの最後で return "返す文字列"
とすることでメソッドが戻り値を返すようになる。
なお、Ruby の場合、return 文を書かなくても、メソッドの最後に記述した処理の結果が戻される仕様なので、単に文字リテラルを書くだけでも OK。
*C あたりの古い言語でプログラム覚えた人間からすると、return 文で明示的に戻り値を書いていないとちょっと気持ち悪さがある。
お題2:greet というメソッドを定義して、実行したら"おはよう"と出力されるように実装せよ
def greet
"おはよう"
end
puts greet
お題2はゼロから自分でメソッドを定義しましょう、というお題。
特記すべきポイントは無し。
お題3:下記のコードの間違いを修正し、文字列を大文字に変換するメソッドを実装せよ
def upcase
word.upcase
end
str = upcase(hello)
puts str
まず、上記の例での間違いは 2 か所。
- upcase メソッドが引数を受け取れるようになっていない
-
upcase(hello)
だと、hello という文字列ではなく、hello という名の変数を渡している
def upcase(word)
word.upcase
end
str = upcase('hello')
puts str
間違いを修正すると上記の通り。
メソッドで引数を受け取りたい場合はdef メソッド名(引数, ...)
という形で宣言する。
お題4:引数に渡した数字を倍にして返すメソッドを実装せよ
def multi(number:)
number * 2
end
number = multi(number: 1024)
puts number
特に新たなポイントはないが、勉強のために「キーワード引数」というものを使ってみた。
multi(number:)
という風に宣言しておくと、呼び出し時に明示的にキーワード名もつける必要がある。
「明示的にキーワード名もつける必要がある。」と言われると「呼び出し時のタイプ数が増えるだけで面倒くさい」となってしまうのだが、ちゃんとメリットもあって、
- 引数の順序を気にしなくてよい
- (命名の仕方次第だが)それぞれの引数が何を意味しているのか、呼び出す側のコードを見ただけでも想像できるようになる。
- 要するにプログラムの可読性が上がる。
というところがメリットになる。
趣味で自己完結してプログラミングしているだけなら、あんまり考えなくても良いのかもしれないが、仕事としてプログラミングをする場合、作ったプログラムを作成者が一生メンテナンスするわけでは無い。
なので、他人が見たときにサッパリ分からないコードというのは、仕事の質としては非常に悪い、ということになる。
もっとも、自分が書いたプログラムであっても、時間をおいて改めて見ると当時の意図が分からなかったりすることもザラにあるので、未来の自分のためにもソースコードの可読性っていうのは非常に大事。
Discussion