##パーフィクトRubyとは
改訂2版 パーフェクトRuby Rubyサポーターズ (著)
という、Ruby界では有名な本。
全592ページ。
パーフィクトRubyをやる理由
プログラミングスクール{テックエキスパート}
でRubyの勉強していたが、業務レベルだと全くできないことがわかったので、1からRubyについて学ぶ。
(※環境構築はのぞく)
##初級編:1章から3章まで
1章 Rubyの概要
読むコードを書くことがほとんどないので、Rubyについて学んだ。
環境構築ばかりなので、さらっと読んでこの章を終わり。
2章 Rubyの言語仕様
【主に学んだ内容】
- メソッドの定義
- 変数
- グローバル変数
- インスタンス変数
- クラス変数
- クラス
- 継承
- モジュール
- 記法の括弧や細かいところ
では、一つずつコードをかいてアウトプットします。
メソッドの定義
みなさんもおなじみも**"def"**
インスタンスは基本的defを用いる。
簡単なコードを書くとこんな感じ↓
def orz(name)
name.each do |name|
puts "Ruby","#{name.upcase}"
end
end
col=['意外にむずくね','って奥深くね','できたらいいな']
orz(col)
Ruby
意外にむずくね
Ruby
って奥深くね
Ruby
できたらいいな
ここで理解できたこと
- defの仮引数の使い方
- メソッド名. do の使い方
- 変数への代入
- 配列
とにかく右辺に出したい値をいれる
自分で値をいれて試して、想像していた値がでたらOK的な感覚でやってます。
変数
変数に関して現在学んだ内容は3つ
1.グローバル変数 $code
どこでも使える変数
2.インスタンス変数 @code
インスタンス内で使用できる変数
3.クラス変数 @@code
クラス内で使える変数
インスタンス変数の別の書き方
class Display
attr_accessor :code
end
クラス
クラスのなかの継承について
class parent
def good
puts "良い"
end
end
class child < parent #サブクラス名<スーパークラス名
def bad
puts "悪い"
end
end
child=Child.new
child.good #良い
child.bad #悪い
クラスの継承は<をいれるだけ。
クラス継承とインスタンス変数とクラス変数をクラス変数を使うと以下の通り。
class Display_parent #スーパークラス
@@name_top="Ruby" #クラス変数
attr_accessor :name_back #インスタンス変数
def name_top
puts @@name_top
end
end
class Display_child < Display_parent #継承をしたもの
def name_back
self.name_back="まだパーフェクトじゃない"
end
end
display_child=Display_child.new #display_childを作る
puts display_child.name_top,display_child.name_back #出力結果、Ruby まだパーフェクトじゃない
簡単に書けばすぐにコードをかけるが、クラスやインスタンスを用いて書くと、意外とむずい。
####モジュール
module Docomo
class Parser
puts "ドコモ"
end
end
module Au
class Parser
puts "エーユー"
end
end
Docomo::Parser
Au::Parser
ここはだだ覚えるだけ。
記法の括弧や細かいところ
%w(Ruby Java PHP JavaScript) #["Ruby", "Java","PHP", "JavaScript"] 配列
%i(Ruby Java PHP JavaScript)#[:Ruby,:Java,:PHP,:JavaScript] 配列
%r(/file/ruby) #\/file\/ruby/ スラッシュを使う場合に使う
name="ruby"
%q{It's #{name}} #"It's|#{name}" 式展開とバックスラッシュは無効
%(It's #{name}) #It's Ruby
%Q(It's #{name}) #It's Ruby
外部フィイル読み込み
require '/path/to/ruby.rb' #/path/to/ruby.rbを読み取る
require './ruby' #rubyの実行されてるディレクトリにあるruby.rb
require 'ruby' #ruby.rbを探して読み取ってくれる
ここも覚えるだけ
3章 制御構造 組み込み関数
【主に学んだ内容】
- 制御構造
- 条件分岐
- 繰り返し
- 例外処理
- 配列展開
- yidld
- 細かいところ
では、一つずつコードでアウトプット。
##制御構造
条件分岐のいろんな書き方
#条件式1
n=1
if n.zero?
puts 0
elsif n.even?
puts "偶数でいた"
elsif n.odd?
puts "奇数でした"
else
puts "わかりません"
end
#条件式2
n=0
unless n.zero?
puts "0ではありません"
else
puts "0です"
end
#条件式3
caseの使った書き方
name = 'ruby'
#条件式1型
name ="Java"
case name
when "ruby"
puts "勉強してる"
when "Java","PHP"
puts "勉強してない"
else
puts "よくわかりません"
end
name ="Java"
case name
when /ruby/
puts "勉強してる"
when /Java|PHP/
puts "勉強してない"
else
puts "よくわかりません"
end
#条件式2型
detected =
case name
when /ruby/
puts "勉強してる"
when /Java|PHP/
puts "勉強してない"
else
"よくわかりません"
end
puts detected
#条件式3型
case name
when /ruby/ then "勉強してる"
when /Java|PHP/ then "勉強してない"
else "よくわかりません"
end
case name
when name == "ruby"
puts "勉強してる"
when name == "Java"||name == "PHP"
puts "勉強してない"
else
puts "よくわかりません"
end
繰り返し
languages =%w{prel Python Ruby}
i=0
while i<languages.length
puts "hello","#{languages[i]}"
i+=1
end
例外処理
returned=
begin
value='値が帰ってくる'
raise #例外を投げる
rescue
value #valueが戻り値となる
ensure
puts '値が帰ってこない'
end
puts returned
この章は正直よくわからない
ここはあとで復習します。
配列展開
def name(a, *b)
p [a, b]
end
#出力
> name(44, "ruby","Java","php")
[44, ["ruby", "Java", "php"]]
=> [44, ["ruby", "Java", "php"]]
yield
def name
puts "Do it"
yield if block_given?
puts "Just do it!"
end
name
name do
puts "Move it!"
end
ブロックが与えられた時だけyieldが呼び出される
####細かいところ
next breakの違い
# 配列の作成
languages= [ "Java", "Ruby","JavaScript" ,"Python","PHP"]
# 変数の初期化
count = 0
# 配列からそれぞれのインデックス要素を出力する
languages.each do |dev|
# 変数に数値を加算
count += 1
# 条件を判定
if count == 3
# 判定結果が成立するのであれば実行
next
else
# 判定結果が成立しないのであれば実行
puts "#{count} : #{dev}"
end
end
出力結果
1 : Java
2 : Ruby
4 : Python
5 : PHP
変数 count の値が 3 == 3 で成立した為に 3 行目だけが出力されない。
# 配列の作成
languages= [ "Java", "Ruby","JavaScript" ,"Python","PHP"]
# 変数の初期化
count = 0
# 配列からそれぞれのインデックス要素を出力する
languages.each do |dev|
# 変数に数値を加算
count += 1
# 条件を判定
if count == 3
# 判定結果が成立するのであれば実行
break
else
# 判定結果が成立しないのであれば実行
puts "#{count} : #{dev}"
end
end
出力結果
1 : Java
2 : Ruby
変数 count の値が 3 == 3 で成立した為に 3 行目からは出力されず、処理が終了しています。
ブロックをつわかないでファイルに書き込む方法
同じディレクトリにtext_write_test.txtを置いておく。
file =File.open("text_write_test.txt",'w')
file.puts "Hello world"
file.close
上記をすると"hello world"が代入する
vim で良いじゃないと思った。
以上、でアウトプットは終わり
理解できなかったところ
- 仮引数としてブロックを受けるところ
- オブジェトをブロックで渡す
- 例外処理
- ブロックローカル変数
- 外部コマンドを実行する
3章の最後のあたりが全く理解できなかったので、改めて復習したいと思います。
なぜ理解できなかったか
コードを書けば動くけど、実務や応用ができるかどうはわからないので、理解できたと聞かれると、「できてない」と答えるしかない。
今回パーフィクトRubyをやってみた感想
プログラミングは「考えること」が多い。
「プログラミングがわからない」ことを紐解いていくには、「どこの段階がわからないのか」を解読していくのが大事と感じました。
「どこまでできて」、「どこまでできない」のかそこを知っているのと知ってないことはかなり重要。
無知を知る
このことを肝にプログラミングを勉強していきたいと思います。