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
実行結果
インデックスを指定して、要素を変えようとすると動作が、なぜか、おかしくなる。例えば、
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
実行結果
このように、変更した要素以外にも、変更してしまっている。調べてみると、すべて同じ配列オブジェクトを参照していることが原因のようだ。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
実行結果
参考リンク
二次元配列の初期化を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に存在演算子は存在するの?