Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyインタプリタの主要コマンドラインオプション解説!正しい使い方を実例付きでマスターしよう

Rubyインタプリタとは、Rubyのコードを読み込んで実行するプログラムのことです。

しかし、ちょっと待ってください。

実は、標準のRubyインタプリタ(MRI)には、知っておくと便利で興味深いコマンドラインオプションが数多く用意されています。

例えば、次のように入力すると:

ruby -v

現在使用しているRubyのバージョンが表示されます。

また、-eフラグを使えば、ファイルを作成したりirbを起動したりすることなく、コードを直接その場で実行できます。

こんな感じです:

ruby -e 'puts 123'

これらのフラグの一覧は -h オプションで確認できます。さらに、--help を使うと「隠し」フラグも見つけられます。

以下は、特に覚えておきたい有用なフラグの一覧表です。

フラグ 説明
-v Rubyのバージョンを表示
-c 構文チェック(文法エラーの検出)
-e コードを直接実行
-w 警告メッセージを有効化
-r 指定したファイルやgemをrequireする
-I ロードパスにディレクトリを追加
--enable frozen-string-literal すべての文字列リテラルをfreezeする
--dump parsetree 構文解析木を表示

それでは、いくつかのフラグをピックアップして、実際の動作を見ていきましょう!

構文チェック(-c)

書いたコードの文法が正しいかどうかを手軽に確認したいときは、-cオプションが便利です。ファイルを実行せずに構文だけをチェックできるので、大きなスクリプトの事前確認にも役立ちます。

使用例:

ruby -c code_without_syntax_errors.rb
# Syntax OK

ruby -c code_with_syntax_errors.rb
# syntax error, unexpected tIDENTIFIER, expecting end-of-input

シンプルですが、確実に動いてくれる頼れる機能です🙂

クイックrequire(-r)

デバッグ用のgemなど、一時的に特定のライブラリを読み込んでRubyプログラムを実行したいことがありますよね。そんなとき、ファイルの先頭にいちいちrequireを書きたくない場合は、-rフラグを使いましょう。

使用例:

ruby -rpry code.rb

この例では、pryを読み込んだ状態でcode.rbが実行されます。デバッグ作業がぐっと楽になる、とても便利なオプションです!

警告フラグ(-w)

-wフラグを付けると、リント(静的解析)的な警告が有効になり、コードの潜在的な問題点を教えてくれます。

例えば、次のようなコード:

p @test

これを ruby -w で実行すると、以下の警告が出力されます。

warning: instance variable @test not initialized

これは非常に有益な警告です。値を代入する前にインスタンス変数を使おうとしている可能性があるからです。

また、インスタンス変数名のタイポ(打ち間違い)にも気づけるので、問題が深刻化する前に発見できます。

修正方法はシンプルで、変数をあらかじめ初期化しておくだけです。

@test = nil

未使用ローカル変数の警告

別の例を見てみましょう。

c = 1

このコードに対しては、次のような警告が表示されます。

warning: assigned but unused variable - c

この警告を消すには、変数を削除するか、実際に使うようにします。なお、この警告はローカル変数のみが対象です。

ちなみに、ブロック引数で使わない引数がある場合は、アンダースコア(_)に置き換えるのがRubyのベストプラクティスとされています。

:

{ chocolate: 82 }.map { |k, _| k }

これはRubyコミュニティで広く定着している慣習です。_自体に特別な意味があるわけではなく、単に有効な変数名であるというだけの話です。

その他の警告の例

次のコードでは、計算結果がどのメソッドからも返されず、どの変数にも代入されていません。

2 * 2

Rubyはこのように警告してくれます:

warning: possibly useless use of * in void context

修正方法は? 無意味な文を削除するか、結果を変数に代入しましょう。

スペースの有無による曖昧さの警告

今度は、次のメソッドを見てください:

def orange(weight, quantity)
  # ...
end

orangeメソッドの呼び方には、いくつかのバリエーションがあります。

orange 100, 2
orange(100, 2)

orange *[100, 2]
orange(*[100, 2])

警告を有効にした状態で orange *[100, 2] と書くと、次の警告が出ます。

warning: '*' interpreted as argument prefix

何が起きているのか?

原因は「曖昧さ」です。Rubyは orange *[100, 2](splat演算子としての展開)ではなく、orange * [100, 2](掛け算のメソッド呼び出し)だと解釈してしまうのです。

*[の間のスペースの有無が重要になります。スペースがない場合、*は配列に関連付けられたsplat演算子として扱われますが、スペースがあると、*はメソッド呼び出しとみなされてしまうのです。

つまり、このケースではスペースの有無が意味を持つのです。

この警告を回避するには、他の呼び出し形式を使えばOKです。

さあ、あなた自身のコードも -w フラグ付きで実行してみて、警告を一つずつ潰しながらコード品質を向上させてみてください🙂

簡易REPL(-n と -e の組み合わせ)

irbpryといったREPL(Read-Eval-Print-Loop)を使ったことはあるでしょう。実は、-nフラグと-eフラグを組み合わせると、ほんの少しのコードで似たような処理が実現できます。

具体例を見てみましょう:

echo 'bacon\nchocolate\norange' | ruby -ne 'puts $_.upcase'

# BACON
# CHOCOLATE
# ORANGE

このコードは、echoからの入力を受け取り、各行ごとに指定したコード(puts $_.upcase)を実行します。

ここで$_は特殊変数で、getsによって最後に読み込まれた入力値が格納されています。Unix系のテキスト処理コマンドと組み合わせると、ワンライナーでの集計や変換など、さまざまな場面で活躍します。

frozen_string_literalフラグ

Ruby 2.3では、「frozen string literal」というマジックコメントが導入されました。

次のように記述します:

# frozen_string_literal: true

これによりすべての文字列リテラルがfreezeされ、イミュータブル(変更不可)になります。文字列の意図しない変更を防ぎ、パフォーマンス面でもメリットがあります。

同じことを実現するもう一つの方法が、Ruby起動時に --enable=frozen-string-literal フラグを渡すやり方です。

次のようなコード:

str = "abcdef"

str[0] = "b"

このフラグを有効にして実行すると、以下のエラーが発生します。

can't modify frozen String (FrozenError)

では、文字列を変更したい場合はどうすればいいのでしょうか?

その場合は、次のようにします:

str = "abcdef".dup

または、こちらでもOKです:

str = +"abcdef"

どちらの方法でも、freezeされていない(変更可能な)文字列を取得できます。

まとめ

今回は、Rubyのコマンドラインオプションについて学びました。バージョン表示の-v、構文チェックの-c、警告を有効にする-w、そしてfrozen string literal関連のオプションなど、どれも実務で役立つものばかりです。ぜひ一度試してみてください!

この記事が役に立ったら、ぜひシェアして、より多くの人に届けてくださいね。

最後までお読みいただきありがとうございました🙂

  1. Rubyのエイリアス(別名定義)完全ガイド:aliasキーワードとalias_methodの違い

    Rubyでは、既存のメソッドに別名(エイリアス)を付ける方法が2つあります。 alias(キーワード) alias_method(メソッド) どちらも同じ目的で使えますが、挙動が微妙に異なるため、初心者にとって混乱しやすいトピックです。 本記事では、両者の違いを詳しく掘り下げ、しっかりと理解できるように解説していきます。 aliasキーワードとは まずはaliasから見ていきましょう。aliasはRubyのキーワードの一つです(ifやdef、classなどと同じ扱いです)。 基本的な書き方は以下の通りです。 alias print_something puts print_someth

  2. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この