【Ruby初心者】Pythonの書き方はRubyではどうなる?

Python

これからRubyの勉強をしたい!
PythonとRubyの違いをざっくりと知りたい!

本記事は、これまでPythonを勉強してきた人を主な対象者として作成しました。

PythonとRubyはどちらも、オブジェクト指向で作られ、コンパイル不要のスクリプト言語であるという点で似ているとよく言われます。なのでPythonを一通り学習した方なら、Rubyもサクサク書けるようになるでしょう。

しかし全く同じというわけではもちろんなく、それぞれの言語にはそれぞれ特徴があります。そのちがいをこれから紹介していきます。

出力

文字列や値を出力する際、Python3ではprint関数を使えばよいのでした。

print("Hello world!")

一方Rubyの場合は、主に4つの出力方法があります。

print "Hello world!"
puts "Hello Ruby!"
p "Hello Japan!"
printf("I am %d years old.", 20)

printメソッドでは、出力の最後に改行がつきません

putsメソッドは、Pythonと同様出力の最後に改行がつきます

pメソッドは、出力の最後に改行がつくのに加え、文字列なら「””」マーク、のように型情報(文字列や数値型など)も一緒にわかるように出力されます。

printfメソッドは、Pythonのformatメソッドに相当するもので、書式を指定して出力するためのものです。なお、出力の最後に改行がつきません

コメントアウト

PythonもRubyも、1行のコメントアウトは先頭に「#」を付ければOKです。

複数行コメントアウトする場合は、PythonとRubyでは以下のように異なります。

# コメントアウト

"""
複数行コメントアウト
複数行コメントアウト
"""
# コメントアウト

=begin
複数行コメントアウト
複数行コメントアウト
=end

変数

RubyはPythonとは異なり、定数というものが存在します。定数にしたい名前の先頭を大文字にする(「Num」「NAME」など)ことで定義できます。

定数は、変数とはちがって書き換えが基本的にはできません。しかし、Rubyでは書き換えすることは可能で、警告が出るだけの仕様になっています。

# 変数
num = 10

# 定数
Num = 30

# 定数を書き換えることはできるが、警告が出る
Num += 2

# warning: already initialized constant Num
# warning: previous definition of Num was here

if文

if文はPythonもRubyもほとんど同じですが、細かいところで若干違います。

if a == 10:
    print(str(a) + " is ten.")
elif a > 10:
    print(str(a) + " is bigger than ten.")
else:
    print(str(a) + " is smaller than ten.")
if a == 10
  puts a.to_s + " is ten."
elsif a > 10
  puts a.to_s + " is bigger than ten."
else
  puts a.to_s + " is smaller than ten."
end

Pythonでは、条件式の後にコロン「:」が必要でしたが、Rubyでは付けません。

また、Rubyではif文の終わりに「end」を付けるのを忘れないようにします。

あと「else if」の書き方ですが、Pythonでは「elseif」ですがRubyでは「elsif」になっていることに注意してください。

さらにRubyでは、if文を後ろに持ってくることができたり、unless文というものが存在します。unless文は、Pythonで「if not …」に相当すると考えればよいです。

# 後ろにifをおいてもよい
puts a.to_s + " is ten." if a==10

# unless文
unless a != 10
  puts a.to_s + " is ten."
else
  puts a.to_s + " is not ten."
end

for文

for文もPythonとRubyではあまり変わりません。

コロン「:」と「end」の有無が違います。

for i in [1,2,3,4]:
    print(i)
for i in [1,2,3,4]
  puts i
end

while文

while文もPythonとRubyではあまり変わりません。

コロン「:」と「end」の有無が違います。

i = 0
while i < 10
  printf("%d is smaller than ten.\n", i)
  i += 1
end
i = 0
while i < 10:
    print(i, "is smaller than ten.")
    i += 1

関数(メソッド)の定義

関数の定義もPythonとRubyではあまり変わりません。

コロン「:」と「end」の有無が違います。

def pow(a,b)
  return a**b
end
def pow(a,b):
    return a**b

ダブルクォーテーションとシングルクォーテーション

Pythonでは、ダブルクォーテーション「”ABC”」もシングルクォーテーション「’ABC’」もあまり変わりません。(「”これは’Python’です”」や「’これは”Python”です’」などクオーテーションの中にクォーテーションを入れる場合は使い分ける)

しかしRubyの場合は、両者を使い分ける必要がある場面があります。

A = 10
B = 5

puts "A + B = #{A+B}"
# A + B = 15

puts 'A + B = #{A+B}'
# A + B = #{A+B}

puts "ABCDE\nFGHIJ"
# ABCDE
# FGHIJ

puts 'ABCDE\nFGHIJ'
# ABCDE\nFGHIJ

ダブルクォーテーションで囲むと、#{}の中が式展開されて計算結果が出力されますが、シングルクォーテーションではそのまま出力されてしまいます。

また、ダブルクォーテーションで囲むと「\n」「\t」など空白文字・改行文字が適用されますが、シングルクォーテーションではそのまま出力されてしまいます。

破壊的メソッド

破壊的メソッドとは、参照先の値を変えてしまうメソッドのことです。

Rubyではメソッド名の末尾に「」マークがつくと、破壊的メソッドであることを示しています。

array = [300, 200, 150, 400, 100]

# 非破壊的メソッド
array.sort
p array
# [300, 200, 150, 400, 100] (元の配列は不変)

# 破壊的メソッド
array.sort!
p array
# [100, 150, 200, 300, 400] (元の配列が変更)

Pythonでは「!」マークはついていませんでしたね。

array = [300, 200, 150, 400, 100]

# 非破壊的
sorted(array)
print(array)
# [300, 200, 150, 400, 100]

# 破壊的
array.sort()
print(array)
# [100, 150, 200, 300, 400]

配列の扱い

配列の扱いでPythonとRubyで違う主な点は、
・スライス
・末尾追加
・削除
です。

array = [300, 200, 150, 400, 100]

# 参照
p array[0] # 300
p array[-1] # 100
p array[0..2] # [300, 200, 150] (0以上2以下)
p array[0...2] # [300, 200] (0以上2未満)

# 変更
array[2] = 50
p array
# [300, 200, 50, 400, 100]

# 末尾に追加(2個以上も可)
array.push(200, 300)
p array
# [300, 200, 50, 400, 100, 200, 300]

# 末尾に追加(他の書き方)
array << 600
p array
# [300, 200, 50, 400, 100, 200, 300, 600]

# 先頭に追加(2個以上も可)
array.unshift(10, 20)
p array
# [10, 20, 300, 200, 50, 400, 100, 200, 300, 600]

# 挿入
array.insert(2, 10)  # 2の位置に10を挿入
p array
# [10, 20, 10, 300, 200, 50, 400, 100, 200, 300, 600]

# 指定した要素を削除
array.delete(200)
p array
# [10, 20, 10, 300, 50, 400, 100, 300, 600]

# 指定位置の要素を削除
array.delete_at(4)
p array
# [10, 20, 10, 300, 400, 100, 300, 600]

# 要素を先頭から削除
array.shift(2)  # 先頭から2個を削除
p array
# [10, 300, 400, 100, 300, 600]

# 指定範囲の要素を削除
array.slice!(1..3)  # 1,2,3の位置の要素を削除
p array
# [10, 300, 600]
array = [300, 200, 150, 400, 100]

# 参照
print(array[0]) # 300
print(array[-1]) # 100
print(array[0:2]) # [300, 200] (0以上2未満)

# 変更
array[2] = 50
print(array)
# [300, 200, 50, 400, 100]

# 末尾に追加
array.append(200)
print(array)
# [300, 200, 50, 400, 100, 200]

# 挿入
array.insert(2, 10)
print(array)
# [300, 200, 10, 50, 400, 100, 200]

# 指定した要素で、最初にあるものを削除
array.remove(200)
print(array)
# [300, 10, 50, 400, 100, 200] (2つ目以降の200は削除されない!)

# 指定位置の要素を削除
array.pop(4)
print(array)
# [300, 10, 50, 400, 200]

# 指定範囲の要素を削除
del array[1:3]
print(array)
# [300, 400, 200]

最後に

今回はPythonとRubyの基本的な文法の違いについて紹介しました。

もちろんこの他にも相違点はたくさんあるので、Pythonの知識を利用しながらRubyをどんどん書けるようにしていきましょう!

ブログを読んでくれたあなたに質問です!

記事への意見・感想はコチラ