Sendagaya.rb #328 参加レポート
はじめに
プログラミング初学者の自分が勉強のためにSendagaya.rb #328に参加させて頂いたのでその備忘録。
話題
前半は先日行われたRubyKaigi Takeout 2020を見て気になった話題について話し、後半は15分ほどで誰か1人を抽選で選ぶプログラムを各々書いてみようという流れでした。
それぞれについて自分が学びとして感じたことをまとめます。
学び
Ruby Next
RubyKaigiで話題に上がっていたgemで、Rubyの最新機能をそのバージョンにアップグレードすることなく、現在使用しているバージョンで使えるようにトランスパイルしてくれる。
対象の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の簡単なアウトプット問題に取り組んでいきながら鍛えていきたいと思います。
参考
- ruby-next
- Ruby Next: Make all Rubies quack alike — Martian Chronicles, Evil Martians’ team blog
- Ruby NextトランスパイラでRubyの新機能を使おう(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- 抽象構文木
- Kernel.#sleep (Ruby 2.7.0 リファレンスマニュアル)
- Enumerable#each_with_object (Ruby 2.7.0 リファレンスマニュアル)
- library pp (Ruby 2.7.0 リファレンスマニュアル)