#+OPTIONS: ^:{}
#+TITLE: はじめてのRuby
#+AUTHOR: Shun Takahashi
#+LANGUAGE: jp
#+OPTIONS: H:4 toc:t num:2
# -*- mode: org; -*-
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
# +SETUPFILE: /Users/bob/Github/org-html-themes/setup/theme-readtheorg-local-daddygongon.setup
# * drillを作ってみる
# 1. まず,Listを取り出す
# 1. 実行結果をつける
# 1. コードの振る舞いを記述するタイトルをつけていく.
* print,puts,pメソッド
** helloruby.rb
「Hello, Ruby.」という文字列を出力するプログラムを作成せよ
#+begin_src ruby
print('Hello, Ruby.\n')
#+end_src
#+begin_example
Hello, Ruby.
#+end_example
** helloruby_2.rb
「Hello, "Ruby".」という文字列を出力するプログラムを作成せよ
#+begin_src ruby
print("Hello, \"Ruby\".\n")
#+end_src
#+begin_example
> helloruby_2.rb
Hello,"Ruby".
#+end_example
** p_method.rb
「"Hello,\n\tRuby."」という文字列を出力するプログラムを作成せよ
#+begin_src ruby
p "Hello,\n\tRuby."
#+end_src
** kiritsubo.rb
# かな文字を出力で表示させるだけって必要?
* コマンドラインからのデータの入力
** print_argv.rb
コマンドラインから引数を5つ入力として受け取り、出力するプログラム
#+begin_src ruby
# List3.1 print_argv.rb
puts "最初の引数: #{ARGV[0]}"
puts "2番目の引数: #{ARGV[1]}"
puts "3番目の引数: #{ARGV[2]}"
puts "4番目の引数: #{ARGV[3]}"
puts "5番目の引数: #{ARGV[4]}"
#+end_src
#+begin_example
実行例
> ruby print_argv.rb 1st 2nd 3rd 4th 5th
最初の引数: 1st
2番目の引数: 2nd
3番目の引数: 3rd
4番目の引数: 4th
5番目の引数: 5th
#+end_example
** arg_arith.rb
コマンドラインから数値を2つ受け取り、和、差、積、商を表示するプログラム
#+begin_src ruby
num0 = ARGV[0].to_i
num1 = ARGV[1].to_i
puts "#{num0 + num1}"
puts "#{num0 - num1}"
puts "#{num0 * num1}"
puts "#{num0 / num1}"
#+end_src
#+begin_example
> ruby answer.rb 5 3
8
2
15
1
#+end_example
* 変数
** area_volume.rb
3つの数値x、y、zを受け取り、縦x、横y、高さzの直方体の表面積と体積を求めるプログラム
#+begin_src ruby
x = ARGV[0].to_i
y = ARGV[1].to_i
z = ARGV[2].to_i
area = (x*y + y*z + z*x) * 2
volume = x * y * z
print "表面積=", area, "\n"
print "体積=" volume, "\n"
#+end_src
#+begin_example
> ruby area_volume.rb 10 20 30
表面積=2200
体積=6000
#+end_example
* 条件判断
** greater_smaller.rb
# List1.7だけで十分かも
数値を1つ引数として受け取り、それが10以上ならば「greater」、9以下ならば「smaller」と出力するプログラム
#+begin_src ruby
a = ARGV[0].to_i
if a >= 10
print "greater\n"
end
if a <= 9
print "smaller\n"
end
#+end_src
#+begin_example
>ruby greater_smaller_else.rb 20
greater
>ruby greater_smaller_else.rb 5
smaller
#+end_example
** greater_smaller_else.rb
List1.6のプログラムと同じ処理を、elseを用いて実行するプログラム
#+begin_src ruby
a = ARGV[0].to_i
if a >= 10
print "greater\n"
else
print "smaller\n"
#+end_src
#+begin_example ruby
>ruby greater_smaller_else.rb 20
greater
>ruby greater_smaller_else.rb 5
smaller
#+end_example
* 繰り返し
** 1_to_n.rb
入力された1つの数値nを引数として受け取り、1からnまでの数を順番に表示するプログラムを作成せよ
#+begin_src ruby
n = ARGV[0].to_i
i = 1
while i <= n
print i, "\n"
i = i + 1
end
#+end_src
#+begin_example ruby
> ruby 1_to_n.rb 5
1
2
3
4
5
#+end_example
** five_times.rb
# while文と動作での差別化難しい
「All work and no play makes Jack a dull boy.」と5行表示するプログラム
#+begin_src ruby
5.times do
print "All work and no play makes Jack a dull boy."
end
#+end_src
* 配列
** 配列からオブジェクトを取り出す
配列のn番目の要素を取り出し、表示するプログラム
#+begin_src ruby
names = ["小林", "林", "高野", "森岡"]
print names[ARGV[0]]
#+end_src
#+begin_src ruby
>ruby answer.rb 0
小林
#+end_src
** 配列にオブジェクトを格納する
配列の先頭の要素をコマンドラインに入力した要素に変更するプログラム
#+begin_src ruby
nums = [1, 2, 3]
nums[0] = ARGV[0]
print nums
#+end_src
#+begin_example
> ruby answer.rb 5
[5, 2, 3]
#+end_example
** 配列の大きさ
配列を表示し、その配列の大きさも表示するプログラムを作成せよ
#+begin_src ruby
names =
print names, "\n"
print names.size
#+end_src
** 配列と繰り返し
配列全体を表示してから、配列の要素を順に表示するプログラム
#+begin_src ruby
names = ["小林", "林", "高野", "森岡"]
print names, "\n"
names.each do |n|
puts n
end
#+end_src
#+begin_example
> ruby answer.rb
["小林", "林", "高野", "森岡"]
小林
林
高野
森岡
#+end_example
* ハッシュ
** シンボル
コマンドラインから文字列を受け取り、シンボルに変換して表示するプログラム
#+begin_src ruby
n = ARGV[0]
p n.to_sym
#+end_src
#+begin_example
> ruby answer.rb hash
:hash
#+end_example
** ハッシュの操作
:name, :furiganaというそれぞれのキーに"高橋", "タカハシ"というオブジェクトが格納されているハッシュを表示、さらに:telというキーに"000-1234-5678"を格納して再度表示するプログラム
#+begin_src ruby
address = {name: "高橋", furigana: "タカハシ"}
puts address
address[:tel] = "000-1234-5678"
puts address
#+end_src
#+begin_example
> ruby answer.rb
{:name=>"高橋", :furigana=>"タカハシ"}
{:name=>"高橋", :furigana=>"タカハシ", :tel=>"000-1234-5678"}
#+end_example
* 正規表現
** パターンとマッチング
#+begin_src ruby
#+end_src
* ファイルからの読み込み
** read_text.rb
コマンドラインからファイル名を受け取り、該当ファイルのテキストデータを表示するプログラム
#+begin_src ruby
filename = ARGV[0]
text = File.read(filename)
print text
#+end_src
#+begin_example
>ruby answer.rb [filename]
[text]
#+end_example
** read_line.rb
コマンドラインからファイル名を受け取り、該当ファイルのテキストデータを1行ずつ表示すつプログラム
#+begin_src ruby
filename = ARGV[0]
file = File.open(filename)
file.each_line do |line|
print line
end
#+end_src
#+begin_example
#+end_example
** simple_grep.rb
入力したテキストデータの中から、正規表現で指定した特定のパターンにマッチする行を出力するプログラム
#+begin_src ruby
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
file = File.open(filename)
file.each_line do |line|
if pattern =~ line
print line
end
end
file.close
#+end_src
#+begin_example
>ruby answer.rb [pattern] [filename]
#+end_example
* メソッドの作成
** hello_ruby2.rb
「Hello, Ruby.」と表示するメソッドhelloを用いて、
#+begin_src ruby
def hello
puts "Hello, Ruby."
end
hello()
#+end_src
#+begin_example
> ruby hello_ruby2.rb
Hello, Ruby.
#+end_example
* 別のファイルを取り込む
** ディレクトリ内のファイルの取り込み
#+begin_src ruby
def simple_grep(pattern, filename)
file = File.open(filename)
file.each_line do |line|
if pattern =~ line
print line
end
end
file.close
end
#+end_src
#+begin_src ruby
require_relative "grep"
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
simple_grep(pattern, filename)
#+end_src
** Rubyの標準ライブラリ
#+begin_src ruby
require "date"
days = Date.today - Date.new(1993, 2, 24)
puts(days.to_i)
#+end_src