ためすう

Ruby と Ruby on Rails のドキュメント

2019-04-23

やったこと

Ruby と Rails に触れる機会が増えたので、参考にするドキュメントを調査します。

調査

Ruby

github の README.md に記載があったリファレンスです。

Ruby on Rails

github の README.md に記載があったリファレンスです。

Rails Guide からこちらのリンクが貼られています。

↓ こちらは日本語に翻訳されているサイトもあります。

Ruby on Rails のソースコードを読む

2019-04-22

やったこと

Ruby on Rails のソースコードを読む方法を調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

選択肢1

github から Ruby on Rails の ソースコードを落とす

GitHub - rails/rails: Ruby on Rails

この方法の難点は、(あまりないかもしれませんが)Rails の本体をいじって動作を確かめるということが出来なさそうなところです。

選択肢2

rails が install されているファイルから読む

ローカルで実行しているということは、Rails のソースコードもローカルのどこかにあると思われるので、インストールされているファイルから読みます。

今回は、こちらでやってみます。

インストールされているrailsを読む (選択肢2)

gem のインストール先確認

$ gem environment

出力 (一部抜粋)

INSTALLATION DIRECTORY: /Users/xxxxx/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0

上記のディレクトリからrailsを探したのですが、README.mdしかありませんでした。

/Users/xxxxx/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/rails-5.2.2/

どうやら Rails は個別の gem が集合して出来ているようです。

gem のインストール先に下記のディレクトリが存在していました。

rails のソースコードにあるディレクトリ

actioncable
actionmailbox
actionmailer
actionpack
actiontext
actionview
activejob
activemodel
activerecord
activestorage
activesupport
... (続く)

本来ならソースコードを変更して確かめたいところですが、どの gem がどういう役割なのか分かっていないので今日はこの辺で終わります。

Ruby の配列で、先頭、最後の要素を取得する

2019-04-22

やったこと

Ruby の配列で先頭、最後の要素を取得する方法を調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

irb を起動します。

$ irb
irb(main):002:0> a = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
irb(main):003:0> a.first
=> "a"
irb(main):004:0> a.last
=> "d"
irb(main):005:0> a
=> ["a", "b", "c", "d"]

この確認から分かることは、first last で呼び出した後も、元の配列は変更されないということです。

元の配列も変更したいときは、shift pop を使います。

irb(main):007:0> a.pop
=> "d"
irb(main):008:0> a
=> ["a", "b", "c"]
irb(main):009:0> a.shift
=> "a"
irb(main):010:0> a
=> ["b", "c"]

参考

Ruby の定数、変数について

2019-04-16

やったこと

Ruby での定数、変数について調べました。

下記について調べます。

  • 定数
  • ローカル変数
  • グローバル変数
  • インスタンス変数
  • クラス変数

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

定数

定数名は大文字アルファベットで始まる必要があります。

ABC = 'abc'

ローカル変数

ローカル変数名は「ruby」や「ruby」のように先頭が小文字アルファベットかアンダースコア()で始まる必要があります。

ruby = 'ruby_string'
_ruby = 'ruby_string'

グローバル変数

グローバル変数名は$から始まる必要があります。

$abc = 'abc'

インスタンス変数

インスタンスの中でだけ参照できる変数をインスタンス変数と言います。

「クラスインスタンス変数」というものもあるようですが、今回は割愛します。

class My
    def initialize()
        @length = 0
    end

    def length
        @length += 1
    end
end

p @length

c = My.new
p c.length
p c.length

c2 = My.new
p c2.length

実行結果

$ ruby test.rb
nil
1
2
1

attr_accessor を利用すると、インスタンス変数のセッター、ゲッターが定義されるようです。(今回は試しません)

クラス変数

@2つからはじまる名前で記述します。

class My2
    @@length = 0

    def printLen
        @@length += 1
    end
end

my2 =  My2.new
p my2.printLen
p my2.printLen

my2_2 =  My2.new
p my2_2.printLen

実行結果

$ ruby test.rb
1
2
3

参考

Ruby でデバッグするときに使うメソッド (p、puts、print)

2019-04-15

やったこと

Ruby でデバッグするときのメソッドを調べました

下記のメソッドを試しました。

  • p
  • puts
  • print

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

a = {key: 1, name: 'abc'}
b = [1, 2, 3]

puts 'p で出力'
p a
print "\n"
p b

print "---\n"

puts 'puts で出力'
puts a
print "\n"
puts b

print "---\n"

puts 'print で出力'
print a
print "\n"
print "\n"
print b
print "\n"

実行結果

$ ruby test.rb
p で出力
{:key=>1, :name=>"abc"}

[1, 2, 3]
---
puts で出力
{:key=>1, :name=>"abc"}

1
2
3
---
print で出力
{:key=>1, :name=>"abc"}

[1, 2, 3]

参考

【ruby】p pp puts print 違い。 - Qiita

Ruby で配列コピーするときに Marshal を使う

2019-04-14

やったこと

Ruby で配列コピーするときに、うまくいかない場合がありました。

Marshal を使ってコピーして解決しました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

c1 = [
    1, 2, 3
]

c2 = c1

c2[0] = 9999999
p c2[0]
p c1[0]

実行結果

$ ruby test.rb
9999999
9999999

どうやら変数の c1 と c2 は同じ参照を持っているようです。 違う方法でコピーすることにします。

test2.rb

c3 = [
    1, 2, 3
]
c4 = Marshal.load(Marshal.dump(c3))
c3[0] = 9999999
p c3[0]
p c4[0]

実行結果

$ ruby test2.rb
9999999
1

うまくいきました。

Ruby を irb 上で動作させている時、外部ファイルの読み込み直しをする

2019-04-11

やったこと

Ruby を irb 上で動作させている時、外部ファイルの読み込み直しをする方法について調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

my_class.rb

class MyClass
    def display
        p 'test-print1'
    end
end

出力結果の例

$ irb

irb(main):013:0> require "./my_class"
=> true
irb(main):014:0> a = MyClass.new
=> #<MyClass:0x007f91c1399810>
irb(main):015:0> a.display()
"test-print1"

ここで my_class.rb を書き換えます。

class MyClass
    def display
        p 'test-print2'
    end
end

irb 上で該当ファイルを load します。 require では変更が反映されませんでした。

require で試した場合 (※ 変更が反映されないパターン)

irb(main):017:0> require "./my_class"
=> false
irb(main):018:0> a = MyClass.new
=> #<MyClass:0x007f91c1379510>
irb(main):019:0> a.display()
"test-print1"
=> "test-print1"

load で試した場合

irb(main):020:0> load "./my_class.rb"
=> true
irb(main):021:0> a.display()
"test-print2"
=> "test-print2"

参考

自分が書いたRubyプログラムをirb上で読み込む方法 - Qiita

Ruby の hash で存在していない key を参照しようとした場合の挙動を制御する

2019-04-10

やったこと

Ruby の hash で存在していない key を参照しようとした場合の挙動を制御する方法について調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

h = {key: 'value'}

p h[:key]
p h[:key2]

h2 = Hash.new do |k, v|
    # ここで例外を発生させるなどする
    p "#{v} is nothing"
end
h2[:key] = 'value'


p h2[:key]
h2[:key2]

実行結果

$ ruby test.rb
"value"
nil
"value"
"key2 is nothing"

Ruby で hash を利用する

2019-04-08

やったこと

Ruby で hash を利用する方法について調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

h = {'key' => 'key1', 'desc' => 'desc'}
p h

h2 = {:key => 'key1', :desc => 'desc'}
p h2

h3 = {key: 'key1', desc: 'desc'}
p h3

実行結果

$ ruby test.rb
{"key"=>"key1", "desc"=>"desc"}
{:key=>"key1", :desc=>"desc"}
{:key=>"key1", :desc=>"desc"}

Ruby の empty? と nil? について調べた

2019-04-07

やったこと

Ruby で empty? と nil? について調べました。

確認環境

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

調査

test.rb

abc = [
    nil,
    '',
    false,
    0,
    [],
]

abc.each_with_index do |v, i|
    printf("check %d\n", i)
    begin
        if v.nil?
            p 'abc is nil'
        else
            p 'abc is not nil'
        end
    rescue => error
        p error
    end

    begin
        if v.empty?
            p 'abc is empty'
        else
            p 'abc is not empty'
        end
    rescue => error
        p error
    end
end

実行結果

$ ruby test.rb

check 0
"abc is nil"
#<NoMethodError: undefined method `empty?' for nil:NilClass>
check 1
"abc is not nil"
"abc is empty"
check 2
"abc is not nil"
#<NoMethodError: undefined method `empty?' for false:FalseClass>
check 3
"abc is not nil"
#<NoMethodError: undefined method `empty?' for 0:Fixnum>
check 4
"abc is not nil"
"abc is empty"