0
1

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.

パーフェクトRubyをひたすらやってみた。(アウトプット用)

Posted at

##パーフィクトRubyとは
改訂2版 パーフェクトRuby Rubyサポーターズ (著)
という、Ruby界では有名な本。
全592ページ。

パーフィクトRubyをやる理由

プログラミングスクール{テックエキスパート}
でRubyの勉強していたが、業務レベルだと全くできないことがわかったので、1からRubyについて学ぶ。

(※環境構築はのぞく)
##初級編:1章から3章まで

1章 Rubyの概要

読むコードを書くことがほとんどないので、Rubyについて学んだ。
環境構築ばかりなので、さらっと読んでこの章を終わり。

2章 Rubyの言語仕様

【主に学んだ内容】

  • メソッドの定義
  • 変数
    • グローバル変数
    • インスタンス変数
    • クラス変数
  • クラス
    • 継承
  • モジュール
  • 記法の括弧や細かいところ

では、一つずつコードをかいてアウトプットします。

メソッドの定義

みなさんもおなじみも**"def"**
インスタンスは基本的defを用いる。

簡単なコードを書くとこんな感じ↓

ruby.rb
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をやってみた感想

プログラミングは「考えること」が多い。

「プログラミングがわからない」ことを紐解いていくには、「どこの段階がわからないのか」を解読していくのが大事と感じました。

「どこまでできて」、「どこまでできない」のかそこを知っているのと知ってないことはかなり重要。

無知を知る

このことを肝にプログラミングを勉強していきたいと思います。

0
1
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?