ためすう

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"

Ruby で構造体を使う

2019-04-04

やったこと

Ruby で構造体を利用する方法を調べました。

確認環境

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

試す

test.rb

Node = Struct.new(:key, :parent, :left, :right)

node = Node.new('key1', 'parent1', 'left1', 'right1')
p node

実行結果

$ ruby test.rb
#<struct Node key="key1", parent="parent1", left="left1", right="right1">

参考

Rubyの構造体(Struct) の使い時とは? | Permanent Til

Ruby でループを逆向きに実行する

2019-04-02

やったこと

ループを逆向きに実行する方法を調べました。

例えば下記の配列があった場合

[1, 3, 5, 7, 9]

下記のように出力します

9
7
5
3
1

確認環境

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

試す

ruby test.rb

a = [1, 3, 5, 7, 9]

(a.length-1).downto(0) do |i|
    p a[i]
end

実行結果

$ test.rb
9
7
5
3
1

参考

【Ruby】繰り返し処理について(for, while, until, each, time, loop) - TASK NOTES

Ruby で文字列を配列にする

2019-03-29

やったこと

文字列を1文字ずつ配列にする方法を調べました。

確認環境

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

調査

test.rb

a = "1234"
p "a.split"
b = a.split("")

# 分割後
p b

# 分割してに1文字ずつ取り出すパターン
p "パターン1"
b.each do |v|
    p v
end

# 分割せずに1文字ずつ取り出すパターン
p "パターン2"
for i in 0...a.length
    p a[i]
end

実行結果

$ ruby test.rb
"a.split"
["1", "2", "3", "4"]
"パターン1"
"1"
"2"
"3"
"4"
"パターン2"
"1"
"2"
"3"
"4"

参考

split (String) - Rubyリファレンス

Ruby で平方根を求める

2019-03-27

やったこと

平方根を求める方法を調べました。

確認環境

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

平方根を求める

test.rb

p Math.sqrt(2)
p 2 ** 0.5

実行結果

$ ruby test.rb
1.4142135623730951
1.4142135623730951

参考

平方根を求める - Ruby Tips!