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

💎 Rubyの基本

Posted at

はじめに

これはRuby蚀語に぀いお孊習したこずの蚘録です。

Rubyっおどういう存圚

  • オブゞェクト指向蚀語(すべおがオブゞェクトでできおいる)
  • スクリプト蚀語(コンパむル抜きで実行できる)

Rubyファむルの実行

ruby ファむル名.rb

倖郚ファむルの読み蟌み

requre "ラむブラリ名"
# 自分で䜜ったファむルを読み蟌む
require "./ファむル名" # 拡匵子「.rb」は省略可
# Ex. 同じディレクトリ䞋にある「sample.rb」ずいうファむルを読み蟌む堎合
require "./sample"

コメントアりト

# 1行のコメントアりト

=begin
耇数行のコメントアりトはこうです。
ここに曞いたこずは実行されたせん。
=end

# これでも
# いいです

マゞックコメント

プログラムの先頭行に入れたりする呪文。

# frozen_string_literal: true

いかにもコメントアりトのように芋えたすが 

str1 = "hello"
str2 = "hello"

p str1.frozen?                     #=> false
p str1.object_id == str2.object_id #=> false
# frozen_string_literal: true
str1 = "hello"
str2 = "hello"

p str1.frozen?                     #=> true
p str1.object_id == str2.object_id #=> true

このように出力に差が出たす。
Rubyではオブゞェクトに察しおナニヌクな敎数(オブゞェクトID)が割り圓おられるのですが、# frozen_string_literal: trueを蚘述しおおくず、デフォルトで「文字の内容が同じなら、オブゞェクトIDも同じにしたす」ずいう蚭定が働きたす。
オブゞェクトに察しお.object_idメ゜ッドを䜿うずIDの䞭身が確認できたす。

irb (むンタラクティブRuby)

コン゜ヌルにirbコマンドを入力しおEnter

irb
irb(main):001> # ここにRubyのコヌドを蚘述する

簡単なRubyのプログラムを詊すのに䟿利です。ここで行った操䜜は特に保存されたせん。

exitで終了でき、元のコン゜ヌルに戻りたす。

irb(main):001> exit

プロンプトの矢印をシンプルにするオプション

irb --simple-prompt
>> # 芋やすくお䟿利

入力 / 出力

  • 入力に䜿うコマンド: gets
  • 出力に䜿うコマンド: p, print, puts

入力: gets

input = gets # inputずいう倉数に入力倀を栌玍

gets: 䞀行を読み蟌んで、読み蟌み成功時にはその文字列を返したす。
぀たり、耇数行を読み蟌みたい堎合はgetsコマンドを耇数回実行する凊理を曞いたり、getsで取埗した倀を敎数に倉えたい時はto_iメ゜ッドを䜿うなどの工倫が必芁です。
改行文字を陀去するchompメ゜ッドず組み合わせおgets.chompずするのはよくやる手です。

出力: p, print, puts

p: 文字列かそうでないかを芋分けられる圢で出力したす。

# 型情報を䞀緒に出力
p "Hello" #=> "Hello"
p 1       #=> 1

print: 末尟に改行文字を入れずに出力したす。

print "こんにちは"
print 21
print "䞖玀少幎"
#=> こんにちは21䞖玀少幎

puts: 匕数ず改行を順番に出力したす。匕数なしの堎合は改行のみを出力したす。

[サンプルコヌド]

puts 1
puts "H"
puts "E"
puts "L"
puts "L"
puts "O"
puts # 匕数なし
puts ["毎日あいさ぀", "倧事です"] # 匕数が配列

[サンプルアりトプット]

1
H
E
L
L
O

毎日あいさ぀
倧事です

メ゜ッド定矩ず実行

メ゜ッド定矩

def メ゜ッド名(匕数)
  凊理
end

サンプルコヌド

def hello # 匕数のないメ゜ッドを定矩
  puts "Hello"
end

hello # 匕数なしでメ゜ッド実行
#=> Hello

def greeting(name)
  puts "Hello, #{name}."
end

greeting("Mike") # 匕数を枡しおメ゜ッド実行
#=> Hello, Mike.

匏展開

#{倉数名や匏}: ダブルクォヌトで囲んだ文字列の䞭で、匏の実行や倉数の倀を文字列に埋め蟌む圢で衚瀺できたす。

name = "Nick"
puts "My name is #{name}."
#=> My name is Nick.

puts "#{1 + 2}"
#=> 3

オブゞェクトのクラス(型のようなもの)を調べる

.class: オブゞェクトのクラス名を返したす。

p 123.class      #=> Integer
p 0.1.class      #=> Float
p "sample".class #=> String
p nil.class      #=> NilClass
p true.class     #=> TrueClass

.is_a?(クラス名): オブゞェクトが、匕数で䞎えられたクラスたたはサブクラスのむンスタンスであるかを刀定し、ブヌリアン倀を返したす。

p "text".is_a?(String) #=> true
p 0.is_a?(String)      #=> false

条件分岐

if ~ elsif ~ else ~ end: Rubyはelsifずいう衚蚘なので泚意。

if 条件匏A
  条件匏Aがtrueの時に実行する凊理
elsif 条件匏B
  条件匏Bがtrueの時に実行する凊理
else
  これたでの条件匏がfalseの時に実行する凊理
end

繰り返し

each文: 配列によく䜿いたす。配列の芁玠を1぀ず぀取り出し、取り出した芁玠に察しおの凊理を曞きたす。

[サンプルコヌド]

strings = ["オラ", "無駄"]

strings.each do |string|
  puts string * 10
end

[サンプルアりトプット]

オラオラオラオラオラオラオラオラオラオラ
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄

ハッシュを察象にしたeach文

[サンプルコヌド]

hsh = { ruby: "ルビヌ", perl: "パヌル", crystal: "クリスタル" }

hsh.each do |key, value|
  puts "キヌ: #{key}, バリュヌ: #{value}"
end

[サンプルアりトプット]

キヌ: ruby, バリュヌ: ルビヌ
キヌ: perl, バリュヌ: パヌル
キヌ: crystal, バリュヌ: クリスタル

while文: 条件がtrueである間ルヌプしたす。条件がfalseになればルヌプが終了したす。

[サンプルコヌド]

i = 18
good_night = 21

while i <= good_night
  puts "今は#{i}時か..."
  i += 1
end

puts "よし、寝よう"

[サンプルアりトプット]

今は18時か...
今は19時か...
今は20時か...
今は21時か...
よし、寝よう

until文: 条件がfalseの間、ルヌプしたす。while文の逆のような存圚です。

[サンプルコヌド]

day = 1
num = 1

until day >= 31 # day が31以䞊であるか刀定し、falseの間ルヌプ
  puts "#{day}日目: お米を#{num}粒もらったよ"
  num *= 2
  day += 1
end

[サンプルアりトプット]

1日目: お米を1粒もらったよ
2日目: お米を2粒もらったよ
3日目: お米を4粒もらったよ
4日目: お米を8粒もらったよ
... (äž­ç•¥) ...
28日目: お米を134217728粒もらったよ
29日目: お米を268435456粒もらったよ
30日目: お米を536870912粒もらったよ

配列

# 空の配列を生成
arr = []

# いろいろなものが栌玍できおしたう
sample_arr = [1, "hoge", { "name" => "Taro", "age" => 18 }]

配列ぞの芁玠の栌玍や取り出し方法、たた、配列に甚意されたメ゜ッドは倚くの皮類がありたす。奥が深いので個別蚘事にしたいです。

ハッシュ

連想配列ずもいいたす。キヌず倀の組み合わせで関連付けができるずころが配列ず異なる点です。配列がむンデックスずいう添字をもずに倀を取り出せるのに察しお、ハッシュではuser1をもずにMichaelを取り出したり、country1をもずに日本を取り出したりなど、人間が理解しやすい圢匏で倀を操䜜できたす。

hsh = { キヌ1 => 倀1, キヌ2 => 倀2 }

[サンプルコヌド]

product = { "name" => "涌感シヌト", "price" => 350 }

def price_half(item)
  item["price"] /= 2
end

price_half(product) # 半額メ゜ッドを実行

puts "なんず、#{product["name"]}を#{product["price"]}円で販売䞭"

[サンプルアりトプット]

なんず、涌感シヌトを175円で販売䞭

シンボル

:symbolのような、先頭にコロンが付いた文字列のこずです。芋かけは文字列ですが、内郚ではナニヌクな敎数ずしお扱われ、「シンボルずいうオブゞェクト」ずしお存圚しおいたす。(Symbolクラス)

シンボルを䜿う堎面

シンボルは䞀床䜜るず䞍倉であり、文字列よりもメモリ効率が良いため倀の比范が高速です。その性質から、ハッシュのキヌずしおシンボルが䜿われる堎面が倚いです。

ハッシュのキヌにシンボルを䜿う䟋

sample_hash = { :Ruby => "Rails", :PHP => "Laravel" }

衚蚘が違うが同じ意味↓

sample_hash = { Ruby: "Rails", PHP: "Laravel" }

[サンプルコヌド]

shinsei_b_komachi = [
  { name: "ルビヌ", age: 16 },
  { name: "かな", age: 17 },
  { name: "MEMちょ", age: 25 }
]

shinsei_b_komachi.each do |member|
  if member[:age] >= 18
    puts "#{member[:name]}は成人です"
  else
    puts "#{member[:name]}は未成幎です"
  end
end

[サンプルアりトプット]

ルビヌは未成幎です
かなは未成幎です
MEMちょは成人です

クラスベヌスのオブゞェクト指向

モノに泚目しお珟実䞖界を捉えおプログラムに萜ずし蟌むやり方ずしおオブゞェクト指向プログラミング(OOP: Object-Oriented Programming)がありたす。
「モノの性質(むンスタンス倉数)」ず「モノの操䜜(メ゜ッド)」を「クラス」ずいう蚭蚈図に定矩しお、クラスをもずに「むンスタンス」を生成する手法がクラスベヌスのオブゞェクト指向です。

# クラス定矩
class クラス名
  # attr_accessor[reader/writer] でゲッタヌやセッタヌメ゜ッドが楜に䜜れる

  def initialize # むンスタンス生成時に呌ばれるメ゜ッド
    倧䜓はここでむンスタンス倉数を甚意する
  end

  def 䜕らかのメ゜ッド
  end
end
# むンスタンスを生成
倉数 = クラス名.new(匕数)

[サンプルコヌド]

class Bird
  def initialize(name)
    @name = name
  end

  def fly
    puts "#{@name}は空ぞ飛び立぀"
  end

  def eat(food)
    puts "#{@name}は#{food.name}を#{food.quantity}食べた"
  end
end

class Penguin < Bird
  def fly
    puts "#{@name}が空ぞ飛び立぀こずは叶わなかった..."
  end
end

class Food
  attr_reader :name, :quantity

  def initialize(name)
    @name = name
    @quantity = 0
  end

  def set_quantity(num)
    @quantity = num.to_i
  end
end

# 実行
crow = Bird.new("カラス")
crow.fly
penguin = Penguin.new("ペンギン")
penguin.fly
fish = Food.new("魚")
fish.set_quantity(23)
penguin.eat(fish)

[サンプルアりトプット]

カラスは空ぞ飛び立぀
ペンギンが空ぞ飛び立぀こずは叶わなかった...
ペンギンは魚を23食べた

オブゞェクト指向を䞊手く䜿えるようになるず、

  • 実行文が簡朔で䜕をしおいるかがわかりやすくなる
  • コヌドの保守性・柔軟性が䞊がる
  • 同じようなものを䜿い回せる
  • ある箇所を倉曎した堎合に、その圱響範囲が1぀の責任内に収たる

などのメリットがありたす。
珟圚は関数型プログラミングの人気が䌞びおいたすが、そうはいっおも「オブゞェクト指向を知っおいるし䜿える」前提で珟堎は動いおいるようなので、頑匵っお䜿いこなせるようになりたいです。難しい 。

䟋倖凊理

䟋倖(exception)ずは、凊理の実行䞭に発生する゚ラヌのこずです。
䟋倖時に出る䟋倖刀定をもずに、適切な䟋倖凊理を行うこずでシステム停止やデヌタ砎損を防ぎたしょう。
かの有名な「ぬるぜ」はJavaの「NullPointerException」ずいうnull倀の参照型倉数を参照しようずした時に出おくる䟋倖から来おいたす。

Rubyが甚意しおいる䟋倖のクラス

  • Exception
    • StandardError: 基本はこの子を補足する
      • ZeroDivisionError
      • ArgumentError
      • NoMethodError
        ほか

begin ~ endで䟋倖が発生しそうな凊理を囲み、rescueで゚ラヌを補足し、rescue埌の郚分に䟋倖凊理を蚘述したす。

begin # 䟋倖の予感がしたらbeginで囲む
  䜕らかの凊理
rescue StandardError # 䞊蚘凊理でStandardErrorが吐き出された堎合に䟋倖凊理を実行
  䟋倖凊理を曞く
else
  正垞な時の凊理を曞く
ensure
  正垞であろうず䟋倖であろうず実行する凊理を曞く
end

倉数に䟋倖オブゞェクトを割り圓おる構文

rescueで䟋倖を捕捉した時に、倉数eに栌玍する特殊な構文がありたす。
しばしば゚ラヌメッセヌゞを取り出すのに䜿われたす。

begin
  # 凊理
rescue StandardError => e
  puts "Error: #{e.message}"
end

raise 発生させたい䟋倖のクラス: 明瀺的に゚ラヌを出す堎合に䜿えたす。

[サンプルコヌド]

begin
  puts 1 / 0
rescue StandardError => e
  puts "Error: #{e.message}"
end
#=> Error: divided by 0

begin
raise ArgumentError.new("匕数゚ラヌです。")
rescue StandardError => e
  puts "Error: #{e.message}"
end
#=> Error: 匕数゚ラヌです。

gem: 倖郚ラむブラリ

Rubyでは、gemずいう圢匏で倖郚ラむブラリが提䟛されおおり、自分でgemを䜜っお提䟛するこずもできたす。

gemのむンストヌル

gem install ラむブラリ名

むンストヌルされおいるgemの䞀芧衚瀺

gem list

gemのアンむンストヌル

gem uninstall ラむブラリ名

Bundlerで䟝存関係を解消

Bundlerは英語のbundle(束ねる)が由来のgemの䟝存関係を管理するツヌルです。
Bundler自身もgemですが、䞀床Bundlerをむンストヌルするず、その埌は䞻にBundlerを䜿っお他のgemを導入するようになるほどの䟿利なや぀です。

Bundlerを䜿っおgemをむンストヌルする手順

ステップ1. Gemfileを䜜成する

bundle initが䟿利

cd プロゞェクトのディレクトリ
bundle init
# 䞊蚘コマンドでGemfileが䜜成されたす。

ステップ2. Gemfileにむンストヌルしたいgemの名前を文字列(ダブルクォヌトたたはシングルクォヌトで囲む曞き方)で蚘述する

# -- Gemfile --
source "https://rubygems.org" # むンストヌル元を指定

gem "むンストヌルしたいgemの名前" # バヌゞョンを指定しない堎合
gem "むンストヌルしたいgemの名前", "~> 4.2.0" # バヌゞョンを指定する堎合

ステップ3. bundle installを実行する

bundle install
# Gemfileに蚘茉されたgemを、Bundlerが䞀括でむンストヌルする
# この時、バヌゞョンを瀺すGemfile.lockが生成される

Bundlerでgemをアンむンストヌルする手順

ステップ1. bundle exec gem uninstallを実行する

bundle exec gem uninstall 䞍芁なgemの名前

# バヌゞョン指定版
bundle exec gem uninstall 䞍芁なgemの名前 -v "バヌゞョン名"

ステップ2. Gemfileから該圓郚分を削陀する(手動で削陀)

-- Gemfile --
# 手動で消せばOK

ステップ3. Gemfile.lockから削陀する(bundle update を実行)

bundle update
# たたは bundle install でも可
# Gemfile.lock の䞭身が曎新される

デバッグgem: Ruby/debugの掻甚

非垞に䟿利なデバッグ甚のgemです。
gemのむンストヌルを実行埌に、

Rubyコヌド内で䜿う

コヌドの先頭の方にrequire "debug"で読み蟌みを行い、デバッグコン゜ヌルを起動したい堎所にbinding.bを仕蟌むだけです。

# Rubyファむル
require "debug"

binding.b # この箇所でデバッグコン゜ヌルが起動する

デバッグコン゜ヌルでは、nで次のステップに進んだり、i(info)で倉数䞀芧を衚瀺したりできたす。

静的解析ツヌルgem: RuboCopの掻甚

gem名rubocop: むンストヌル埌に、静的解析したいディレクトリ䞋でrubocopコマンドを䜿うず解析結果が衚瀺されたす。
デフォルトの蚭定はガチガチで厳しいので、プロゞェクトのディレクトリ䞋に.rubocop.ymlファむルを䜜成し、その䞭に蚭定を蚘述するず、RuboCopは蚭定ファむルを優先するので、皋よい加枛になりたす。

cd プロゞェクトのディレクトリ
touch .rubocop.yml
# .rubocop.ymlファむルに適切な蚭定を曞き蟌む

# 解析の実行
rubocop ファむル名
# ファむル名を指定しない堎合はディレクトリ䞋の党ファむルを察象ずしたす。

※静的解析ツヌルのため、あくたで「倉な空癜がありたすよ」ずか「この倉数はどこからも䜿われおいたせんよ」などの「コヌディングルヌルに埓っおいるか」のチェックが䞭心であり、実行時の゚ラヌをしっかり防いでくれる性質のものではありたせん。

参考

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