SyuchiNikuRingの備忘録

お勉強したことをまとめておく場所。中の人の理解や感覚で書いているから不正確なことも多いかも。

インターーーーーーーーーン‼まとめpart10

やっほー。今回はちょっと前に参加したインターンのお話。
守秘義務守秘義務で大したことは話せませんけどね。

とある大手SIerに一週間ほど行きました。SIerに行ったといってもシステムを構築したりしたわけではなく、セキュリティに関連したことをしていました。

有名なマルウェアに関して分析・検証をし、レポートを作成する。

これが与えられた職務でした。これしか言えない。

社員さんが非常に優しい方で、とにかく楽しかった一週間でした。

働きたいとも思えたしね。

Ruby入門season5~継承~

やっほー。久しぶりの更新です。

今回はクラス継承のお話をまとめます。このエントリをもってRubyはいったんおしまい。

とりあえずいってみよー。

継承により親クラスのインスタンス変数とインスタンスメソッドが引き継がれるのでメソッドを踏襲したい場合やマイナーチェンジをしたい場合に使います。
Rubyの継承はこのように書きます。

require ./(継承したいクラス)

class (子クラス) < (親クラス)
end

実際に書いてみました。
ペットショップのプログラムです。
親クラス、子クラス、実行メソッドの順に並んでいます。コードテストにかけた結果、

Line 8: syntax error, unexpected tSYMBEG, expecting ')'
def initialize(name:, price:, length:)
^
Line 12: syntax error, unexpected kEND, expecting $end

と返されました。うーーーん。
テストに使ったのは、
codepad
です。
詳しくはこちらを。実際にテストにかけた結果が載っています。
http://codepad.org/vFhqPx8D

class Creature

  attr_accessor :name
  attr_accessor :price
  attr_accessor :length

  def initialize(name:, price:, length:)
    self.name = name
    self.price = price
    self.length = length
  end

  def profile
    return "#{self.name}#{self.price}円です。全長は#{self.length}mくらいになります。"
  end
end


  require "./Creature" #creatureクラスを継承
  class Fish < Creature
    attr_accessor :swim_speed

    def initialize(name:, price:, length:, swim_speed:)
      #superを用いてCreatureクラスのinitializeメソッドとの共通項をまとめて継承
      super(name: name, price: price, length: length)
      self.swim_speed = swim_speed
    end

    #profileを継承&オーバーライド
    def profile
      return "#{self.name}#{self.price}円です。全長は#{self.length}mくらいです。
      泳ぐ速さは#{self.swim_speed}km/hくらいです。"
    end
  end

  require "./Creature" #Creatureクラスを継承
  class Reptiles < Creature
      attr_accessor :run_speed

      def initialize(name:, price:, length:, run_speed:)
        #superを用いてCreatureクラスのinitializeメソッドとの共通項をまとめて継承
        super(name: name, price: price, length: length:)
        self.run_speed = run_speed
      end

      def profile
        return "#{self.name}#{self.price}円です。全長は#{self.length}mくらいです。
        走る速さは#{self.run_speed}km/hくらいです。"
      end
  end

    #それぞれのクラスを読み込み
    require "./Fish"
    require "./Reptiles"

    fish1 = Fish.new(name:"バショウカジキ", price:750, length:3.3, swim_speed:112)
    fish2 = Fish.new(name:"錦鯉", price:40000000, length:30, swim_speed:16)

    reptile1 = Reptiles.new(name:"バシリスク", price:8000, length:0.6, run_speed:3.6)
    reptile2 = Reptiles.new(name:"ブラックマンバ", price:50000, length:2, run_speed:16)

    creatures = [fish1, fish2, reptile1, reptile2]
    number = 1
    creatures.each do |creature|
      puts "No.#{number} #{creature}"
      number += 1
    end

    puts "どの生き物が気になりますか?"
    creature_number = gets.chomp.to_i

    selected_creature = creatures[creature_number][:name]
    puts "#{selected_creature}ですね。かわいいですよね。おすすめです。"

修正(2018/09/18)**

順番変えるとエラーは一か所のみになりました。
http://codepad.org/Hv9f5I18

Ruby入門season4~クラス分け~

やっほー。今回はクラスを分けることについてまとめていきます。
コードが増えてくると、一つのクラスに詰め込むのは精神衛生上良くないので、クラスを分けます。
分ける際には、require "./クラス"とします。こうすることでファイル内でファイル外のものを読み込めるようになります。
次に標準入力の受付についてです。ようやく登場しましたね。gets.chompを用いて標準入力を受け付けます。ただしこれは常に文字列として受け付けます。数値として受け付けたいときには、gets.chomp.to_iを使います。これで数値として入力を扱えます。
早速やってみます。これが実行クラス側です。

require "./menu"

menu1 = Menu.new(name: "茶碗蒸し", price: 1000)
menu2 = Menu.new(name: "釜めし", price: 1200)
menu3 = Menu.new(name: "寿司", price: 3000)
menu4 = Menu.new(name: "葛餅", price: 600)

#配列に入れる。
menus = [menu1, menu2, menu3, menu4]
#メニューを表示
index = 0
menus.each do |menu|
  puts "#{index}. #{menu.order}"
  index += 1
end

puts "ご注文はお決まりですか"

order_index = gets.chomp.to_i #注文番号を標準入力から受け取る
selected_menu = menus[order_index] #受け付けたメニューを取り出す
puts "ご注文は#{order_index}番の#{selected_menu.name}でよろしいでしょうか"

puts "おいくつになさいますか"
count = gets.chomp.to_i #個数を標準入力から受け取る

puts "お会計は#{selected_menu.total_price(count)}円になります"

そしてこれが分割したクラスです。

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize(name:, price:)
    self.name = name
    self.price = price
  end
  
  def order
    return "#{self.name} #{self.price}"
  end
  
  def total_price(count)
    total_price = self.price * count
    return total_price
  end
end

実行した結果はこんな感じ。
f:id:SyuchiNikuRing:20180909160623p:plain

葛餅の気分なので3を選択します。
f:id:SyuchiNikuRing:20180909160650p:plain

個数を聞かれます。
f:id:SyuchiNikuRing:20180909160716p:plain
個数を入力するとお会計まで計算してくれました。

今回はここまで。

余談ですが、今回からはコードをちゃんと表示できるようになりました。

Ruby入門season3~クラス~

やっほー。今回はクラスに関してまとめます。前回はメソッドをまとめたので自然な流れですね。

 

基本的な考え方や定義の仕方はJavaと同じです。

中の人の好物である茶碗蒸しでクラスを作りました。

f:id:SyuchiNikuRing:20180908081806p:plain

Rubyのクラスはclass / endで定義します。クラス内のインスタンスはattr_accessorで定義します。インスタンスの先頭に「:」が付くので忘れないようにします。

インスタンスの生成は、クラス.newです。Javaによく似ていますね。(Javaはnew クラスでした。)

インスタンスに値を入れるときは、(オブジェクト).(インスタンス)とします。

先ほどのプログラムを実行します。

f:id:SyuchiNikuRing:20180908082201p:plain

うまくいきました。

クラスの中でメソッドを定義していきます。

f:id:SyuchiNikuRing:20180908084230p:plain

Javaとほとんど変わらないですね。実行してみます。

f:id:SyuchiNikuRing:20180908084313p:plain

menu1とmenu2に対してメソッドが確かに呼び出されています。インスタンスに対して呼び出すメソッドをインスタンスメソッドといい、インスタンス変数というものがあります。self.変数とすることで先ほど生成したインスタンスに代入した値をインスタンスメソッド内で呼び出せます。

 

f:id:SyuchiNikuRing:20180909104145p:plain

 

実行します。

f:id:SyuchiNikuRing:20180909102517p:plain

 いい感じですね。

ところで、ここまで①クラスを作ってから②インスタンスを生成し、それから③インスタンスに値を入れるという手順でやってきました。Javaでも同じことをしていましたが、Javaには②③をまとめてできるコンストラクタというものがありました。Rubyにも同じ機能はないのでしょうか。

ちゃんとあります。initializeメソッドといいます。実際にコードを見てみましょう。

f:id:SyuchiNikuRing:20180909114630p:plain

6行目から9行目にかけてinitializeメソッドが定義されていて、インスタンスの定義と値の代入を同時に行っています。そして、23行目でインスタンスmenu1に対してorderメソッドを呼び出しています。orderメソッドを呼び出したとき、まず実行されるのがinitializeメソッドです。ここでインスタンスとその値を受け取り、それをorderメソッドに渡しています、実行結果を見てみましょう。

f:id:SyuchiNikuRing:20180909115056p:plain

うまく出ました。orderメソッドの結果は一行目に出ている通りです。

とはいえ、これではinitializeメソッドで値を代入しているので、呼び出す度にいつも同じ値が呼び出されてしまいます。そこで、initializeメソッドに引数を渡すことで様々な値に対応できるようにしましょう。

f:id:SyuchiNikuRing:20180909120430p:plain

5行目から9行目までのinitializeメソッドではインスタンス変数に引数を渡しています。

その引数は23行目でキーワード引数を用いて具体的な値を代入されています。ここの値を変えれば、キーワード引数に紐づいているメソッドの出力は全て変更できます。

さて実行結果を見てみます。

f:id:SyuchiNikuRing:20180909121009p:plain

うまくいきました。お土産高っ…

インターーーーーーーーーン‼まとめpart9

やっほー。昨日までRubyのまとめに夢中になってインターンのまとめを書くのを忘れていました。

一昨日に大手SIerグループ企業の子会社に行ってきました。情報システムの中でもインフラとミドルウェアを守備範囲にしている子会社です。

今回は業務体験よりも会社説明会に近い形でしたので書くことはありません。

 

事業投資シミュレーション→業界・業務の説明→社員への質問って感じでしたね。

 

今回はこれまで。

 

そろそろ「BIツールをいじってみた」シリーズやります。

Ruby入門season2~メソッド~

やっほー。今回はメソッドのお話。

以前、Javaオブジェクト指向の件でも書きましたが、Rubyオブジェクト指向型言語です。なのでメソッドがあります。

syuchinikuring.hatenablog.com

 

メソッドの定義の仕方は簡単です。def と end でやりたい処理を挟むだけ。

f:id:SyuchiNikuRing:20180907180029p:plain

実行します。

f:id:SyuchiNikuRing:20180907180047p:plain

うるさい客ですね...とまあこんな感じでメソッドは作れます。

引数も当然増やせます。その際、メソッドを呼び出して引数に代入する際には、メソッドの定義順に代入しなければならないことに注意です。

ちなみにこの例はJavaでいうところのpublic voidに当たるメソッドです。では戻り値を返すメソッドはないのでしょうか。...あります!returnを使います。いつもと全く同じです。

f:id:SyuchiNikuRing:20180907181827p:plain

4割引きのセールタイムのメソッドです。実行します。

f:id:SyuchiNikuRing:20180907181908p:plain

いい感じですね。今回はメソッド内で0.6、つまり小数を乗じているので、結果も小数型で出力されています。なので、600円が600.0円という為替の表記のようになっています。

戻り値には真偽値も取れます。その場合にはメソッド名の直後に?をつけます。

f:id:SyuchiNikuRing:20180907183144p:plain

某電機量販店と被っていますが一切関係ありません。地域最安値でなければ割引に応じてくれ、地域最安値であれば割引を拒まれるメソッドです。実行します。

f:id:SyuchiNikuRing:20180907183420p:plain

キレられなくてよかった...price = 12000, area_lowest = 9000なので割引に応じてくれました。メソッドの中でifを使えばさらに細かい処理もできるようになりますね。

 

最後にキーワード引数に関してです。引数が増えると、呼び出す際にどの引数を書いているのか、順番を気にしないといけないので確認するのが面倒です。そこでキーワード引数です。前回のシンボルの件と同じです。

f:id:SyuchiNikuRing:20180907184653p:plain

実行します。

f:id:SyuchiNikuRing:20180907184714p:plain

...ブルジョワですね。ホストクラブメソッドです。引数を代入するところで「:」を使っています。このように書くと、どの引数に何を代入するのかを明確化できていいですよね。

今回はここまで。