cloud9_note

cloud9に限らないメモ

View on GitHub

Ruby

チュートリアル

配列

存在しない添字

a = [1, 2, 3]
# 下記はnil(エラーにならない。)
puts a[100]

値の追加

a = [1, 2, 3]

a[4] = 100

puts a
1
2
3

100

値を末尾に追加

a = [1, 2, 3]

a << 4

puts a
1
2
3
4

配列から値を削除

a = [1, 2, 3]
a.delete_at(1)

printf("a : %s\n", a)
printf("a.length : %d\n", a.length)
a : [1, 3]
a.length : 2

多重代入

a, b = [1, 2]
printf("a : %d\n", a)
printf("b : %d\n", b)

p '----'

c, d = [1]
printf("c : %d\n", c)
printf("d : %s\n", d) # nil

p '----'

e, f = [100, 200, 300]
printf("e : %d\n", e)
printf("f : %d\n", f)

a : 1
b : 2
"----"
c : 1
d : 
"----"
e : 100
f : 200

商と余りを配列で取得する

div_mod = 14.divmod(3)
printf("商 : %d\n", div_mod[0])
printf("余り : %d\n", div_mod[1])
商 : 4
余り : 2

繰り返し

基本(each)

numbers = [1, 2, 3, 4]
sum = 0

numbers.each do |n|
    sum += n
end

puts sum
10

新しい配列を生成する(map/collect)

numbers = [1, 2, 3, 4, 5]
new_numbers = numbers.map{ |n| n * 10}

print(new_numbers , "\n")
[10, 20, 30, 40, 50]

条件を満たす要素を取得する(select/find_all)

numbers = [1, 2, 3, 4, 5]
new_numbers = numbers.select{ |n| n.even? }

print(new_numbers , "\n")
[2, 4]

条件を満たさない要素を取得する(reject)

numbers = [1, 2, 3, 4, 5]
new_numbers = numbers.reject{ |n| n.even? }

print(new_numbers , "\n")
[1, 3, 5]

条件を満たす要素のうち、最初に見つかった要素を返す(find/detect)

numbers = [1, 2, 3, 4, 5]
p numbers.find{ |n| n.even? }
2

合計値を取得する(sum)

numbers = [1, 2, 3, 4, 5]
p numbers.sum
p numbers.sum{ |n| n * 2 }
p numbers.sum(100)

chars = ['hoge', 'piyo', 'fuga']
p chars.sum(",")
15
30
115
",hogepiyofuga"

文字列を連結する(join)

chars = ['hoge', 'piyo', 'fuga']
p chars.join(',')
"hoge7,piyo,fuga"

条件を満たす要素を削除する(delete_if)

a = [1, 2, 3, 1, 2, 3]

a.delete_if do |n|
    # 奇数を削除
    n.odd?
end

print a , "\n"
[2, 2]

do-endを使わないループ

numbers = [1, 2, 3, 4]
sum = 0
numbers.each { |n| sum += n }
p sum
10

&とシンボルを使う

languages = ['ruby', 'java', 'python']
print(languages.map{ |lang| lang.upcase } , "\n")
print(languages.map( &:upcase ) , "\n")
["RUBY", "JAVA", "PYTHON"]
["RUBY", "JAVA", "PYTHON"]

Range

2種類ある。

def p_range(value)
    range_double = 1..5
    range_triple = 1...5
    printf("%s.include?(%1.1f) : %5s , %s.include?(%1.1f) : %5s\n",
        range_double, value, range_double.include?(value) ,
        range_triple, value, range_triple.include?(value))
end

p_range(0)
p_range(1)
p_range(4.9)
p_range(5)
p_range(6)
1..5.include?(0.0) : false , 1...5.include?(0.0) : false
1..5.include?(1.0) :  true , 1...5.include?(1.0) :  true
1..5.include?(4.9) :  true , 1...5.include?(4.9) :  true
1..5.include?(5.0) :  true , 1...5.include?(5.0) : false
1..5.include?(6.0) : false , 1...5.include?(6.0) : false

部分配列の取得

a = [1,2,3,4,5]
# 添字3を含む
print(a[1..3], "\n")
[2, 3, 4]

配列の生成

# 普通のRange
print(1..5.to_i , "\n")

# Rangeを使った配列の生成
print((1..5).to_a, "\n")
print((1...5).to_a, "\n")
1..5
[1, 2, 3, 4, 5]
[1, 2, 3, 4]

フォーマットの指定

puts sprintf('%0.3f', 1.2)

&& の挙動

# true/falseが決まった時点で式としては完了扱いになる。
puts 1&&2
puts 1&&2&&3
$ ruby true_false.rb 
2
3

unless

not equalsを扱う。

b = true

if b
    puts 'hoge'
end

unless b
    # こちらは出力されない。
    puts 'piyo'
end
hoge

デフォルト引数

第2引数にだけ値を渡すことはできない?

def print(word = 'hoge', ignore = 'ignore')
    puts word
    puts ignore
    puts 
end

print
print('aaa')
print(ignore='piyo')
print(word=word, ignore='piyo')
hoge
ignore

aaa
ignore

piyo
ignore


piyo

1行メソッド

「エンドレスメソッド」と呼ばれる。
3.0で追加された構文。

def hoge = return 'hogehoge'
def piyo = 'piyopiyo'

# これはsyntax error。メソッド名と「=」の間に半角スペースが必要
# def fuga= 'fuga'

def foo(a=1) = a*a

puts hoge
puts piyo
puts foo(5)
hogehoge
piyopiyo
25

既存のライブラリを読み込む(require)

require 'date'

puts Date.today
2022-12-30

自作のライブラリを読み込む(require_relative)

model.rb

class DataModel
    attr_reader :data

    def initialize(data = 'default')
        @data = data
    end
end

app.rb

require_relative 'model'

model = DataModel.new('value')
puts model.data
value

自動テスト(Minitest)

.
├── README.md
├── app.rb
├── lib
│   └── fizz_buzz.rb
└── test
    └── fizz_buzz_test.rb
def fizz_buzz(size) 
    for i in 1..size do
        puts fizz_buzz_value(i)
    end
end

def fizz_buzz_value(i)
    if i % 15 == 0 
        'Fizz Buzz'
    elsif i % 5 == 0
        'Buzz'
    elsif i % 3 == 0
        'Fizz'
    else
        i.to_s
    end
end

require 'minitest/autorun'
require_relative '../lib/fizz_buzz'

class FizzBuzzTest < Minitest::Test
    def test_fizz_buzz_value
        assert_equal '1' , fizz_buzz_value(1)
        assert_equal '2' , fizz_buzz_value(2)
        assert_equal 'Fizz' , fizz_buzz_value(3)
        assert_equal '4' , fizz_buzz_value(4)
        assert_equal 'Buzz' , fizz_buzz_value(5)
        assert_equal 'Fizz Buzz' , fizz_buzz_value(15)
        
    end
end

rbenvを更新する

 cd ~/.rbenv
git pull

cd ~/.rbenv/plugins/ruby-build
git pull