Rubyで詰まったところ

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


■既存のクラスに自作のメソッドを追加する

class String
	def StringSize
		return self.size
	end
end

puts "文字列です".StringSize # 5

参考サイト
Rubyアソシエーション: クラスの拡張
[Ruby]他のクラスを拡張するいろんな方法


■複数行のコメント
=begin~=endの中の行がコメント状態になります。

=begin
 puts "この間がコメント欄に"
=end

参考サイト
【Ruby】コメントの書き方


コマンドプロンプトから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]


■そのオブジェクトが、どのクラスに属するのか調べる方法(型の判別にも使える)
.instance_ofメソッドを用いる場合。

if [].instance_of?(Array) # クォーテーションで囲わないので注意
	puts "Array"
else
	puts "Not Array"
end

.classメソッドを用いる場合。

p nil.class # NilClass
p true.class # TrueClass
p false.class # FalseClass
p 1.class # Fixnum
p "str".class # String
p [].class # Array

# 条件分岐に使う場合は、to_sメソッドを用いる
if [].class.to_s == "Array"
    puts "Array"
else
    puts "Not Array"
end

if "String".class.to_s == "String"
    puts "String"
else
    puts "Not String"
end

参考リンク
Ruby :: arrayかどうかチェックする [Tipsというかメモ]


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

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に存在演算子は存在するの?