※当サイトの記事には、広告・プロモーションが含まれます。

Rubyに「列挙型(Enumerated Type)」は無く、定数も更新可能という仕様に震える...

www.nippon-foundation.or.jp

高橋:少しずつ断熱性能の基準を高める動きが出てきてはいるのですが、まだ十分とはいえません。2025年に最低基準として義務化される断熱等級4でも、他の国では断熱性が低すぎて建てることができない、要するに違法建築レベルなんですよ。

日本の住宅、夏は暑くて冬は寒い! 断熱が絶大な効果をもたらすって本当? | 日本財団ジャーナル

――なぜ日本の断熱基準(※)はこんなにも低いのでしょうか?

高橋:いくつか要因がありますが、行政が、住む人の健康や幸せよりも、住宅・建築業界団体の利益や都合を優先してルールを作ってきたという面があります。特に、新築着工数を上げることが大事とされる中で、個々の住宅の質については問われることがありませんでした。断熱基準を高めると建築コストが上がってしまうということもあったでしょう。

また、住宅の場合、輸出をしないので国際競争力が働かず、業界共通の物差しがなかったことも、基準が低い原因だったのではないかと分析しています。自動車の燃費性能や家電の省エネ性能のようなものが、住宅には統一した基準として表示されていませんでした。

※ 2024年4月からは住宅・建築物を販売・賃貸する事業者に、省エネ性能ラベルの表示することが努力義務となった

日本の住宅、夏は暑くて冬は寒い! 断熱が絶大な効果をもたらすって本当? | 日本財団ジャーナル

⇧ 住宅施工に関しては、「Japan Quality」の欠片も無い感じで誠に遺憾ですな...

哀しいですが、お金が全てということですか...

「列挙型(Enumerated Type)」とは

Wikipediaによると、

列挙型(れっきょがた、enumerated typeあるいはenumeration type)とは、コンピュータプログラミングにおいて、プログラマが選んだ各々の識別子(列挙子)をそのまま有限集合として持つ抽象データ型である。

列挙型 - Wikipedia

列挙型は一般に、カードのスートのように番号順を持たないカテゴリ変数として使われるが、実際のコンパイル時あるいは実行時には、列挙型は整数で実装されることが多い。

列挙型 - Wikipedia

各々の識別子は通例異なる整数値を持つが、複数の識別子に対して意図的に同じ整数値を割り当てる(つまり別名を定義する)ことも可能である。

列挙型 - Wikipedia

⇧ とありますと。

また列挙型は、整数を使用する場合と比較して、明示的にマジックナンバーを使用するよりもプログラムソースの可読性を改善するのに役立つ。

列挙型 - Wikipedia

言語によっては、列挙型の整数表現はプログラマに見えないようになっていることもあり、これによりプログラマが列挙値に対して算術演算を行うような乱用を防いでいる。

列挙型 - Wikipedia

列挙型の定数は同じ列挙型の変数にしか代入できない(整数型の変数に代入するには明示的な型変換などが必要)という仕様になっている言語もある。

列挙型 - Wikipedia

プログラミング言語によっては、真偽値論理型は、あらかじめ宣言された二値の列挙型とされている。

列挙型 - Wikipedia

⇧ まぁ、定数の集合体って感じですかね。

定数とは

Wikipediaによると、

⇧「定数(プログラミング)」が該当しそうなので、遷移先のページを確認。

⇧ とあり、「一度設定した値は変更不可」でありますと。

Rubyに「列挙型(Enumerated Type)」は無く、定数も更新可能という仕様に震える...

で、何やら、

  1. Rubyには「列挙型(Enumerated Type)」が存在しない
  2. Rubyで定数は更新可能である

という事実に震えている...

1. Rubyには「列挙型(Enumerated Type)」が存在しない

ネットの情報によりますと、

madogiwa0124.hatenablog.com

job-info.hateblo.jp

Rubyで列挙型を定義するためには、enumという概念はRubyには存在しませんが、同様の機能を提供するためにいくつかの方法があります。

Rubyで列挙型の書き方 - Web開発における知見共有系ページ

⇧ 兎に角、Rubyには「列挙型(Enumerated Type)」が用意されていないらしい。

Wikipediaだと、

⇧ moduleを利用した実装例が紹介されている。

2. Rubyで定数は更新可能である

公式のドキュメントによると、

docs.ruby-lang.org

アルファベット大文字 ([A-Z]) で始まる識別子は定数です。他にも、ソースエンコーディングUnicode の時は Unicode の大文字またはタイトルケース文字から始まる識別子も定数です。 Unicode 以外の時は小文字に変換できる文字から始まる識別子が定数です。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html

定数の定義 (と初期化) は代入によって行われますが、メソッドの中では定義できません。一度定義された定数に再び代入を行おうとすると警告メッセージが出ます。定義されていない定数にアクセスすると例外 NameError が発生します。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html

⇧ とあり、「定数が更新不可能になっていない」ことについては言及されていない...

ネットの情報によりますと、

qiita.com

まとめ

Rubyの定数は、書き換えられるようになっている。
定数は、同じオブジェクト(同じオブジェクトID)を指すことを意味する。
ただし、定数を書き換える、書き換えないはあくまで紳士協定に基づく。
moduleそのものをfreezeするとその中の定数の参照先をfreezeできる。
全てfreezeをつけると定数を変更不可にできるが、Rubyの思想としては、全ての箇所にfreezeをつけるのは固い発想で「freezeを全部つけなくても、紳士協定でやろう」というのがRubyっぽい感じ。

Ruby 定数について #Ruby - Qiita

⇧ 上記サイト様によりますと、

全てfreezeをつけると定数を変更不可にできる

とのことらしい。

Rubyの思想としては、全ての箇所にfreezeをつけるのは固い発想で「freezeを全部つけなくても、紳士協定でやろう」というのがRubyっぽい感じ。

うむ、バグの温床になりそうな予感しかしない。

いやはや、ソフトウェア開発で「Ruby」を選択するのは勇気が要りますな...

仕事で不可避とは言え、「Ruby」に関わりたくないなぁ...

毎度モヤモヤ感が半端ない…

今回はこのへんで。