柴ブログ

プログラミング奮闘記

Sendagaya.rb #328 参加レポート

はじめに

プログラミング初学者の自分が勉強のためにSendagaya.rb #328に参加させて頂いたのでその備忘録。

sendagayarb.doorkeeper.jp

話題

前半は先日行われたRubyKaigi Takeout 2020を見て気になった話題について話し、後半は15分ほどで誰か1人を抽選で選ぶプログラムを各々書いてみようという流れでした。

それぞれについて自分が学びとして感じたことをまとめます。

学び

Ruby Next

RubyKaigiで話題に上がっていたgemで、Rubyの最新機能をそのバージョンにアップグレードすることなく、現在使用しているバージョンで使えるようにトランスパイルしてくれる。

github.com

対象のRubyプログラムのコードのASTを生成し、そのASTをトランスパイルしたいRubyのバージョンのASTに変更し、変更したASTからRubyコードを生成するという原理。

ソースコード → AST → AST変更 → 新たなコード

ここでASTとは?と思い調べてみると、Abstract Syntax Tree の略で、プログラムの文法構造を木 (tree) の形で表したもの。

なるほど、Ruby Nextすごい...(小並)

Rubyのメソッドなど

Sendagaya.rbの後半で15分くらいでみんなで抽選プログラムをRubyで書くことになったんですが、僕はいいアイデアがなく書けず終いでした...面目ない...。

ですが他の参加者のみなさんは面白いプログラムを各々書かれており、さすがだ...!!と思いつつ初めて知るメソッドもあったのでそれをまとめます。

sleep

sleepメソッドは引数に与えた秒数だけプログラムを停止できる。Kernelモジュール。

参加者のみなさんのほとんどが使っており、1人ずつ数秒ごとに当たりか外れか判定して出力することで、抽選らしいドキドキ感が出ました。

each_with_object

each_with_objectメソッドは要素と引数に与えられたオブジェクトをブロックに渡してループし、引数に与えたオブジェクトで返すというもの。Enumerableモジュール。

るりまのサンプルコードを拝借すると以下のようになる。

evens = (1..10).each_with_object([]) {|i, a| a << i*2 }
# => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

pp

オブジェクトなどを見やすく出力するメソッド。ppライブラリのPPクラス。 例えばpメソッドと比較してみる。

require "pp"

users = [
  { name: "ジョナサン", age: 20 },
  { name: "ジョセフ", age: 20 },
  { name: "承太郎", age: 20 },
  { name: "徐倫", age: 20 }
]

p users
pp users

実行結果

# pの場合
[{:name=>"ジョナサン", :age=>20}, {:name=>"ジョセフ", :age=>20}, {:name=>"承太郎", :age=>20}, {:name=>"徐倫", :age=>20}]

# ppの場合
[{:name=>"ジョナサン", :age=>20},
 {:name=>"ジョセフ", :age=>20},
 {:name=>"承太郎", :age=>20},
 {:name=>"徐倫", :age=>20}]

感想

毎度のことながら参加させて頂くたびに学びがあってとても有意義に過ごさせて頂いてます。 単に自分の勉強不足な面もありますが...。

即興でRubyプログラムが書けなかったのがとても悔しかったです。

まだまだメソッドを知らない、ロジックを組む経験が少ない、という点に起因してると思うので、Rubyの簡単なアウトプット問題に取り組んでいきながら鍛えていきたいと思います。

参考