7
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 3 years have passed since last update.

第6回 :: ruby_second

Last updated at Posted at 2020-12-02

!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
7
0
1

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
7
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?