こんにちは、エンジニアのさもです。
最近TensorFlowと画像処理とかで結構pythonを触っているのですが、やっぱりRubyの書き方が好きだなと思うことがありました。
Rubyを触り始めてあと3ヶ月で2年になりますが、Rubyのここが好きだなというところを挙げていきます。
スポンサーリンク
.classメソッド
“クラスメソッド"じゃないです。classというインスタンスメソッドです。
知ってのとおり、Rubyはオブジェクト指向プログラミングです。
クラスがあって、そのクラスから生まれたインスタンスがプログラムの中を動き回るみたいなイメージです。
文字列とか数値とかなら明らかなのですが、そうでないときは、「これどのクラスのインスタンスなんだ」と思うときがあります。
そんなときに、obj.class
とするとインスタンスのクラスが表示されます。
また、何を継承したクラスなのか調べるには、obj.class.superclass
みたいにsuperclassというメソッドが使えます。
クラスもClassクラスのインスタンスなんで、同じようにメソッドが使えるんですね。
superclassメソッドはClassクラスのインスタンスメソッドとして定義されています。
classメソッドはオブジェクト指向の理解にも凄く役に立つんです。
.methodsメソッド
次はmethodsメソッドです。このメソッドに関しては、こちらに詳しく書きました。
こういうメソッド使えるっけ?こんなメソッドあった気がする。みたいな時に、さくっと調べることが出来ます。
メソッドの一覧が出るので、こんなメソッドあったんだ!と新たな発見があるかもしれません。
ちなみに、superclassメソッドがClassクラスのインスタンスメソッドだということを確かめるには、次を実行すればいいです。
Class.instance_methods(false).grep /superclass$/
オープンクラス
メタプログラミング、いわゆる黒魔術のですね。
例えば、数値の平方根を取りたいとき、オブジェクト指向っぽく、16.sqrt
みたいに書きたくないですか?
Rubyではただの数値はFixnumクラスなのですが、Fixnumクラスにsqrtメソッドはありません。
そんなときは、こうします。
class Fixnum def sqrt Math.sqrt(self) end end 16.sqrt #=> 4.0
こんな感じに、既存のクラスを魔改造することが出来るんです。
業務で使うことはほぼないと思いますが、gemを読んだり、作ったりするときは使うことがあるかもしれません。
個人で開発するシステムなら、どんな魔改造だってOKです。
class String def hello ::User.destroy_all end end
すべてがメソッド
class User attr_accessor :name, :age def initialize(name, age) @name = name @age = age end end user = User.new("taro", 16)
Userクラスのインスタンスuserは、名前と年齢を持っています。
では、user.name
としたときの.nameはメソッドでしょうか?それともパラメータにアクセスしているだけでしょうか?
Rubyでは、.~
はすべてメソッドです。
attr_accessor :name
と書けば、ゲッターとセッターが動的に定義されるんですね。
他の言語だと、パラメータのアクセスは.name
で、メソッドは.age()
みたいに使い分けたりするんですが、ageというのが欲しいときに、メソッドなのかパラメータなのか覚えておかないといけないんですね。
こういう小さなストレスがRubyにはないんです。
pメソッド
どの言語でもデバッグをするときに、標準出力へ表示させるメソッドを使いますよね。
よくあるのがprint("helo")
みたいなメソッドです。
何回も書いたりしていると、printっていうのを書くのも疲れてくるんですよね。
`pritn("hello")
みたいにタイポしようものなら、もう、ね、、、
その点、Rubyでは、p "hello"
だけで書けるんです。あるいはppメソッド
ユーザのことをよく考えられてるなって思います。
式展開
Rubyを勉強し始めて、これは凄いと思ったものの一つです。
文字列とメソッドの出力結果の結合ってめんどくさいですよね。
"number: " + i + ", name: " + name
みたいな感じです。
これがRubyだと、"number: #{i}, name: #{name}"
です。
見た感じ短くなってるし、"+“が無い分こちらの方が、どんな風に出力されるのか想像しやすいです。
each
Rubyを勉強し始めて、これは凄いと思ったものの一つです。
配列やハッシュ、ActiveRecord::Relation、文字列など、要素がたくさん入っているものならほぼ何でも、eachメソッドで一つずつ取り出して処理が出来ます。
「たくさん要素があるもの」はeachメソッドで繰り返し処理できるという、ごく直感的にプログラミングできるので、とても楽しいです。
また、一つ一つの要素に対して行う処理内容(ブロック)がオブジェクトになっていて、eachメソッドの引数に渡すという発想も面白いです。
mapやtapメソッドにもブロックを渡すことが出来ますが、これも引数と意識することなく、自然に書くことが出来ます。
!と?
!と?についてはたまに間違った理解(boolean値のメソッドには?が絶対つくとか、破壊的メソッドには!が絶対つくとか、!をつけると自動的に破壊的メソッドになるとか)をされている方がいらっしゃいますが、そのことに注意すれば自分にも他人にも分かりやすいコードを書くことが出来ます。
!がつくと破壊的なメソッド(ただしそうでない場合もみたことがある)、?がつくと真裏値を返すメソッドということになります。
残念ながら変数に使うことは出来ませんでした。
文法上のルールではないけど、慣例的にこう書けば分かりやすいみたいなのは凄く好きです。
特にRubyの!と?は分かりやすくていいなと思いました。
erb
仕事でRailsの開発をしていると、よく目にします。
ファイル名の後ろに.erbがついていると、そのファイルの文中にRubyのコードを埋め込めることが出来るのですが、実はerbは標準ライブラリなんです。
require 'erb'
とすると、Rubyコードを埋め込んだファイルを作るスクリプトを書くことが出来ます。
このことを知って書いた記事がこちらです
Rubyを使ったクローラの入門記事なのですが、erbを使ってみたくて思いついたのが、この記事の内容でした。
最後に
いいなと思うメソッドや書き方を列挙しましたが、やっぱり簡潔に書けるところが好きですね。
あと、オブジェクト指向らしい書き方が出来るので、オブジェクト指向の勉強にもいいなと思いました。
読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。