!Mac OS X-10.15.7 !ruby-2.7.1p83$
variable and method
variable
お題
受け取った引数ARGV[0]をnameという変数(variable)に代入してそれを出力するコードを書く.
> ruby name_variable.rb Rudy
Rudy
こんな感じ
rubyの変数
rubyの変数は型宣言の必要性がない.文脈に合わせて適当に型が定められる.
name = 'Rudy'
解法
下記のコマンドを入力してファイルを作成
> emacs name_variable.rb
emacsを起動
p "Rudy"
と入力してsave.
> ruby name_variable.rb Rudy
"Rudy"
類題
- nameに代入してRudyと打ち出すようにrefactoringしてください.
- ARGV[0]を受け取って,自分の名前を返すようにrefactoringしてください
類題の解法
name = 'Ruby'
puts "hello #{name}."
name = ARGV[0]
puts "hello #{name}."
これでいける
method
お題
> ruby hello_method.rb Rudy
Hell Rudy.
と返すhello methodを作る.
解説
Rubyではfunctionやprocedureなどはmethodを定義する.methodは0個以上の引数を取ることができる.例えば以下のように
def hello(name)
p name
end
類題
先の解法を参照してhello メソッドを完成させる.
def hello(name)
puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
類題の解説
こんな感じで書いた
def hello(name)
puts "hello #{name}"
end
def getname
name = ARGV[0]
return name
end
hello(getname)
おまけ
以下の記事は下記サイトを引用しています(rubyの使い方とは関係ないため自分では書かない)
言語は英語から
これをmethodにしたら,
def func(hoge)
puts "Hello #{hoge}."
end
hoho = ARGV[0]
func(hoho)
これを動かしてみましょう.
> ruby hello.rb bob
とちゃんと動きます.これでは何をしているのかわからないので,コメントをつけましょう.
# method: func
# input: hoge is a name
# output: puts greetings
# return: nil
def func(hoge)
puts "Hello #{hoge}."
end
honya = ARGV[0] # get hoho from argv
func(honya) # call hello with a name honya
英語でしっかりとコメントが書ければ世界中に通用するcodeが書ける…んでしょうかね?コメントをぐちゃぐちゃ書くんじゃなくて,もっとわかりやすい名前(method名,変数名)にしたくなるでしょう?
def puts_hello name
puts "Hello #{name}."
end
name = ARGV[0]
puts_hello name
こっちの方が短くてスッキリしていて圧倒的にいいでしょ? 適切な英単語を使えば,要らん説明が省けます.これが言語は英語からという意味です.
長くなったら,隠せ
もしoptionのnameを打つのを忘れたら,問い合わせてくれると,user interfaceという感じがもっとするでしょう?
name = ARGV[0]
if name == nil
puts "What\'s your name?"
name = gets.chomp
end
というのをname=の下につけましょう[1].ちょっと動かして見ましょう.
> ruby hello.rb
意図通りに動いていますか? でもmain loopが長くなってきちゃいました.そこで,これもmethodに切り出します.領域を指定して(C-spaceで先頭を指定して移動),C-wでcut, 移動してC-yでyankです.
def gets_name
name = ARGV[0]
if name == nil
puts "What\'s your name?"
name = gets.chomp
end
return name
end
name = gets_name
この時,領域を指定してM-x indent-regionとしてください.あるいはC-x TAB.これだけでもだいぶ読みやすくなったでしょ?
もっとできます.main loopにcursorを持って行って,'C-c @ C-l'と打ってみてください.
def puts_hello name...end
def gets_name...end
name = gets_name
puts_hello name
これがoutlineによるtoggle表示からきたすごいメタファなんですよ.何をしているのか知らなくていい部分は隠してしまおうというのが,methodに切り分ける理由なんです.
- source ~/grad_members_20f/members/okamoto0910/article/c6.org