Rubyで詰まったところ

開発環境は、Windows 7 Professional(32bit) + ruby 2.3.3p222。

コマンドプロンプトからRubyスクリプトを書いて実行する
コマンドプロンプトにて、irbと入力する。
・終了するには、exitと入力する。


■二次元配列を作り方、読み込み方、書き換え方

arr = Array.new(5, Array.new(10, "."))

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703160733p:plain

インデックスを指定して、要素を変えようとすると動作が、なぜか、おかしくなる。例えば、

arr = Array.new(5, Array.new(10, "."))

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

print "------\n"

arr[0][0] = "*"
arr[0][1] = "*"
arr[0][2] = "*"

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703152512p:plain
このように、変更した要素以外にも、変更してしまっている。調べてみると、すべて同じ配列オブジェクトを参照していることが原因のようだ。object_idで調べるクセをつけておきたい。

以下のように書き換えてみる。

arr = Array.new(5){Array.new(10, ".")} # ここを書き換える

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

arr[0][0] = "*"
arr[0][1] = "*"
arr[0][2] = "*"

print "------\n"

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703160616p:plain
参考リンク
二次元配列の初期化をmapで [Ruby]


■そのオブジェクトが、どのクラスに属するのか調べる方法
.classメソッドを用いる。

p nil.class # NilClass
p true.class # TrueClass
p false.class # FalseClass
p 1.class # Fixnum


■そのメソッドやプロパティが定義されているのかチェックする

class A
	attr_reader :name,:age
	def initialize(name)
		@name = name
	end

	def test
		puts "test"
	end
end

a = A.new("taro")

# 存在するtestを指定するとdefinedと表示される
if defined?(a.test) then
	puts "defined"
else
	puts "undefined"
end

# 存在しないhogeを指定するとundefinedと表示される
if defined?(a.hoge) then
	puts "defined"
else
	puts "undefined"
end

# 存在するプロパティを指定するとdefinedと表示される
if defined?(a.name) then
	puts "defined"
else
	puts "undefined"
end

# 値は入っていないけれど、attr_readerで指定しているプロパティを指定するとdefinedと表示される
if defined?(a.age) then
	puts "defined"
else
	puts "undefined"
end

参考リンク
Rubyに存在演算子は存在するの?