up:: Programming

書く楽しさに焦点を当てた日本製言語。
pythonぽいが括弧を閉じる必要があったり、関数を一部変更するデコレータ機能が充実してたり、そのせいで柔軟性が高かったりする。ということは複数人で書くの大変だろうなあ。

Rubyの開発環境を用意しよう!(Windows用)

(2025/08/21)msys2にインストーラが依存している。
wslでいいじゃんというとこだけど、wslはCドライブに入るのでscoopでmsys2に入れた。

rbenvでバージョンを管理できるが、困ってからでいいや。

print

puts。puts stringsで動く。puts(strings)でも一応動く。
rubyはこの括弧を省略できる言語。

putsはput stringの略。stringとして出力する。
一方生で出したいときはprintが使える。あまりに使うのでp一文字でも動く。

変数

@変数はインスタンス変数。クラスのインスタンスごとに持たせ、クラス内のどこからでも参照できる変数にできる。pythonのself.変数。
全てのインスタンスで同じ変数を使う(クラス変数)時は、@@で書き込む。pythonだとclass内のdef外で変数を用意するが、rubyはどこでも書き込める。
全てのクラスで同じ変数を使う(グローバル変数)は$。pythonだと普通に全ての外に書いた後、読むときはまずglobal global_varで呼び出してから変更する必要があった。
ちなみに定数も使える。全部大文字で書く。一応記法的には一文字目が大文字でクラス名などに使われていなければ定数扱い。pythonは内部的には変数扱いだった。

local_var = "ローカル変数"
@instance_var = "インスタンス変数" 
@@class_var = "クラス変数"
$global_var = "グローバル変数"
CONSTANT_VAR = "定数"

定数だけ関数内から定義することは出来ない。クラス内やグローバルは可能。関数で書き換えようとすると定義時点でdynamic constant assignmentエラーが出る。
ちなみにグローバルだと書き換えようとすると書き換えられる。が、警告が出る。一部でのAPI切替やデバッグ切替などを見据えてるっぽいが、今はよく分からない。

CONSTANT_VAR = "定数"
 
class TestClass
    # CONSTANT_VAR = "定数" # ここも可能
    def initialize
        local_var = "ローカル変数"
        @instance_var = "インスタンス変数"
        @@class_var = "クラス変数"
        $global_var = "グローバル変数"
        # CONSTANT_VAR = "定数" # ここは不可能
    end
    
    def get_var(var_type)
        case var_type
        when "local"
            puts local_var
        when "instance"
            puts @instance_var
        when "class"
            puts @@class_var
        when "global"
            puts $global_var
        when "constant"
            puts CONSTANT_VAR
        end
    end
 
    def set_var(var_type, new_value)
        case var_type
        when "local"
            local_var = new_value
        when "instance"
            @instance_var = new_value
        when "class"
            @@class_var = new_value
        when "global"
            $global_var = new_value
        # when "constant"
        #     CONSTANT_VAR = new_value # 定義したらエラーになる
        end
    end
end
 
obj1 = TestClass.new
# puts obj1.get_var("local") # ローカルはインスタンスメソッド内でしか使えない
obj2 = TestClass.new
obj2.set_var("instance", "インスタンス変数です")
puts obj1.get_var("instance") # インスタンス変数
puts obj2.get_var("instance") # インスタンス変数です
obj2.set_var("class", "クラス変数です")
puts obj1.get_var("class") # クラス変数です
puts obj2.get_var("class") # クラス変数です
obj2.set_var("global", "グローバル変数です")
puts obj1.get_var("global") # グローバル変数です
puts obj2.get_var("global") # グローバル変数です
$global_var = "グローバル変数ですね"
puts obj1.get_var("global") # グローバル変数ですね
puts obj2.get_var("global") # グローバル変数ですね
puts obj1.get_var("constant") # 定数
puts obj2.get_var("constant") # 定数

環境

プロジェクトごとに分けるbundlerと、rubyバージョンごと管理するrbenvの二つがあるっぽい。
bundlerの場合bundle install --pathした後bundler execで使う。いちいちexec書くのはめんどそう。

gem, bundler と pip, venv の比較 - Qiita

パスはvendor/bundleがデファクト。
bundle config --global pathで設定しとけばいつも同じく作れる。
というか将来--path消えるらしいので

bundle config set path `vendor/bundle`

を一回やっておくのが今らしい。

基本ディレクトリ作ってbundle init
できたgemfileにgem "name", "version"と記入。バージョンは省略可能。
最後にbundle installでgemfileの記述分を全部インストールできる。
使用はbundle exec ruby file

【Ruby】bundlerの使い方 (Gem管理) - TASK NOTES
Bundlerの使い方 - Qiita

sourceは一つは必要。他にもgitから直接出来たりrubyバージョンの指定が出来たりする。

Gemfileについて調べてみた - xxxcaqui.log

rbenvは付属のgemsetを使って仮想環境を作る。rbenb gemset create version nameからさらにinitiがいる。その後はパスに行けばそのまま使えるっぽい。

Ruby で Python の virtualenv 的なことをする - どうした