初めて見る言語の文法は慣れるまでかなり気持ち悪いので、さっさと慣れるように何か書いてしまえば良いんですよね。参考にしたのは以下のサイトです。
オブジェクト指向なのでjavaで書いたことあるものを書き換えてみました。色んな要素を詰め込んだのでプログラミング初めての人はわからないだろうけど、経験者はわかるようなコードかと思います。
kan.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
class Ship attr :name, true attr :kanshu, true attr :equipments, true def initialize(shipname) @name = shipname @equipments = Array.new(4) end #艦種+艦名+装備名 def getShipString() return "#{kanshu} #{name}\n" + getEquipmentsString() end #すべての装備オブジェクトの文字列 def getEquipmentsString() str = "" for n in 0..equipments.length()-1 str += "装備#{n+1} #{equipments[n].name()}\n" end return str end end #戦艦クラス class BattleShip < Ship def initialize(shipname) super(shipname) @kanshu = "戦艦" end end #駆逐艦クラス class Destroyer < Ship def initialize(shipname) super(shipname) @kanshu = "駆逐艦" end end #装備クラス class Equipment attr :name, true def initialize(equipmentname) @name = equipmentname end end #艦隊クラス class Fleet attr :ships, true def initialize(ships) @ships = ships end def getFleetString() str = "" ships.length().times{|n| str += "--#{n+1}番\n" + ships[n].getShipString() } return str end end #戦艦クラスのインスタンスを生成 ships = [BattleShip.new("長門"), Destroyer.new("白露"), Destroyer.new("江風")] #戦艦クラスのインスタンス変数に装備クラスのインスタンスの配列を代入 ships[0].equipments = [Equipment::new("16inch砲"), Equipment.new("18inch砲")] ships[1].equipments = [Equipment.new("5inch砲"), Equipment.new("ドラム缶")] ships[2].equipments = [Equipment.new("探照灯"), Equipment.new("照明弾")] #艦隊クラスを生成 fleet = Fleet.new(ships) print(fleet.getFleetString()) |
……ええ、艦これです(^_^;)
それはともかく、Rubyの変数は型が決まっていないのにあたかも型が決まってるかのようにメソッド呼び出して良いのでしょうか? まあどうせ一人で開発するので自分でわかれば良いんでしょうけど。
文字列の中に変数を埋め込めるのは便利ですね。式展開?と言うそうですけど。あと、0から順に処理するforループはRubyではtimesメソッドが一般的なようです。
変数の型が決まっていないと気持ちが悪いのは病気なんでしょうかねえ。java使いの。
次回はrequire使って組み込みライブラリとか標準ライブラリとか使いたいと思います。
PS:よく見たらif文含まれていないじゃないですかー。やだー。