見出し画像

PythonからRubyに移って思うこと


本格的にRubyを始めて2週間くらい経ちました。今まで仕事でちょこちょこPythonを使っていてPythonに慣れた状態からRubyを勉強して感じたことをつらつらとメモします。

1. endを忘れる

これはPythonからRubyに来た人はあるあるじゃないかと思うんですが、ブロックの最後のendをよく忘れます。Pythonは下のようにブロックをインデントで表現しますが、Rubyはendで明示します。

# 50以上だったら”big!” 50未満だったら"small!"を表示させる場合

# Python3
num = 55
if num >= 50:
    print("big!")
elif num < 50:
    print("small!") # pythonはこれでOK!
# Ruby
num = 55
if num >= 50
    puts "big!"
elsif num < 50
    puts "small!"
end # ←こいつをよく忘れる!

if文の条件の後のコロン有無やelifとelsifの違いも微妙に悩ませるところ。
endを忘れて構文エラーを出しまくりました。

2. Rubyでは「関数」というワードを聞かない

Rubyでは関数というワードを耳にしません。全部メソッドです。Pythonは関数もメソッドもあります。Pythonでコードを書いていたときはあまり意識していなかったのですが、Rubyに触れて確かにこっちの方がシンプルだな、と思いました。

例えばPythonではリスト型のメソッドsortと組込関数のsortedがあります。ややこしい・・・。

# Python3
a = [4, 7, 1, 6, 14]

a.sort()
a
 => [1, 4, 6, 7, 14]  # sortメソッドは元のリストを破壊的に並べ替える


b = [4, 7, 1, 6, 14]

sorted(b)
 => [1, 4, 6, 7, 14]
b
 => [4, 7, 1, 6, 14] # sorted関数は元のリストを変更しない


とある人がRubyのメソッドのことを「必殺技」と呼んでいてこりゃいい表現だな、と思いました。

3. 三項演算子

if文を1行で書くときなんかによく使いますがこれも違いがあります。上の例でいくと、

# 50以上だったら”big!” 50未満だったら"small!"を変数messageに代入する場合

# Python3
num = 55
message = "big!" if num >= 50 else "small!"
message
 => big!


# Ruby
num = 55
message = num >= 50 ? "big!" : "small!"
 => "big!"

Pythonでは
  真のときの値 if 条件式 else 偽のときの値
Rubyでは
  条件式 ? 真のときの値 : 偽のときの値
となります。
ifとかelseを使った方がこの表記方法を知らない人が見ても直感的に理解しやすいのでこれはPythonの方がとっつきやすいなあと思った次第。

4. シンボル???

Pythonでは聞かなかった概念。

class Symbol
要約
シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じ内容のシンボルはかならず同一のオブジェクトです。
Ruby 2.7.0 リファレンスマニュアルより

ちょっと何言ってるかわかりません。hashを定義するときに使うのでPythonでいうディクショナリを定義するときに使うセパレータとしての : (コロン)と区別がつかず混乱してました。

# Ruby
hash = {haneda: 'HND', vancouver: 'YVR', kualalumpur: 'KUL'}
# Python3
dict = {'haneda':'HND', 'vancouver':'YVR', 'kualalumpur':'KUL'}

初見では、こういう表記方法の違いなのね、というふわっとした理解をしましたが全然違いました。

実装
Rubyの内部実装では、メソッド名や変数名、定数名、クラス名などの`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。名前を管理するという役割上、シンボルと文字列は一対一に対応します。また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。
Ruby 2.7.0 リファレンスマニュアルより

immutable?Pythonでいうtupleみたいな?

コロンが前についたり後ろについたりすることも理解を一層妨げています。シンボルの理解が今後RubyやRailsを勉強していく上で鬼門になりそうです。Railsでやたらと出てくるんで。シンボルもおいおいここでまとめたメモを残そうと思います。


色々と書きましたがまだ2週間ですし、これからRubyの奥深さも垣間見えてくることでしょう。あと、RailsとDjangoの違いなんかも理解できてくるといいですね!

サポートいただけましたら椅子から転げ落ちて喜びます。