Ruby定数について知っておくべきことすべて
Rubyの定数とは何ですか?
定数は、常に大文字で始まる変数の一種です。それらは外部でのみ定義できます メタプログラミングを使用しない限り、メソッドの数。
定数は変更されるべきではない値に使用されますが、Rubyはそれらの変更を妨げません。
このように見えます :
FRUIT = "orange"
今 :
定数は重要なトピックであるため、この記事で詳細に説明します。
定数の定義方法
定数は、宣言するために特別な記号や構文を必要としません。最初の文字を大文字にする必要があります。
以下は有効な定数です :
ABC = 1 Goo = 2 Foo = 3
メソッド内で定数を定義できないことに注意してください。
この不可解なエラーメッセージが表示されます :
def the_method ABC = 1 end # "dynamic constant assignment"
したがって、メソッドの外部で定数を定義するだけです。通常、クラスの最上位に定数定義を設定して、それらが明確に表示されるようにします。
class RubyBlog URL = "rubyguides.com" AUTHOR = "Jesus Castello" end
次に、次の構文を使用して、クラスメソッド内またはクラス外でこれらの定数にアクセスできます。
p RubyBlog::AUTHOR # "Jesus Castello"
この投稿の後半で定数の範囲についてもう少し話しますので、ご期待ください!
初期化されていない定数エラー
発生する可能性のある一般的なエラーの1つは、次のとおりです。
puts Foo # "uninitialized constant Foo (NameError)"
このエラーを「定数が見つかりません」と精神的に翻訳してほしい。
このエラーを理解するための重要なポイントの1つは、Rubyクラスが定数であるということです。
例 :
Array String Hash
最初の文字が大文字であるため、これらは定数です。
クラスを定義するとき、実際に行っているのはClass
を作成することです。 定数に割り当てられているオブジェクト。
定数がクラス名になります。
これが重要なのはなぜですか?
「初期化されていない定数」エラーが表示される可能性が最も高いのは、require
を忘れたためです。 定数を定義するファイルまたはgem。
または、定数の名前のつづりを間違えただけかもしれません。
ですから、それに目を光らせておいてください。
定数は変更される可能性があります
冒頭で述べたように、Ruby定数は変更される可能性があります。
例 :
ABC = 1 ABC = 2
ただし、次の警告メッセージが表示されます:
2: warning: already initialized constant ABC
プログラムは引き続き正常に機能しますが、これは避けたいと考えています。
Rubyの変数はコンテナーではなく、単にオブジェクトへのポインターであるため、定数の変更を防ぐ方法はありません。
または、必要に応じてラベルを付けます。
できる最善のことは、不変のオブジェクトを使用することです。
例 :
AUTHOR = "Jesus Castello".freeze AUTHOR << "o" # RuntimeError: can't modify frozen String
関連記事 :Rubyの可変性とフリーズ方法。
この例では、AUTHOR
の内容を変更できます。 定数が指しているのは、freeze
だけです。 オブジェクト自体を変更することからあなたを守ります。
一定の方法
定数の操作専用の方法がいくつかあります:
定数 | |
const_get | |
const_set | |
const_missing | method_missing と同じ ただし、定数の場合 |
const_defined? | 指定された定数(シンボルとして)が定義されている場合はtrueを返します |
remove_const | |
private_constant | 定数をプライベートにして、Class::ABC でクラスの外部にアクセスできないようにします 構文 |
これらの方法を使用して実行できるメタプログラミングのトリックがいくつかあります。
例 :
module Food class Bacon; end class Chocolate; end end puts "Classes defined inside #{Food}:" puts Food.constants
また、「Array」のような文字列を使用して、実際のクラスを取得することもできます:
array_class = Object.const_get("Array")
ただし、文字列がparams
からのものである場合、ユーザーがコードを挿入する可能性があるため、これには注意してください。 または他の形式のユーザー入力。
Railsには、基本的にconst_get
を実行するconstantizeメソッドがあります。 ただし、セキュリティチェックは行われないことに注意してください。
虎の巻
ルビー定数スコープ
クラスの外部で、コードのトップレベルで定数を作成すると、その定数はどこでも使用できるようになります。
定数は子クラスでも使用できます。
class A FOO = 1 end class B < A def foo puts FOO end end B.constants # [:FOO]
ネストされたモジュールまたはクラスの外部で定義された定数は、ネストされたクラスの内部でも使用できます。
module Food STORE_ADDRESS = "The moon" class Bacon def foo; puts STORE_ADDRESS; end end end fb = Food::Bacon.new fb.foo # "The moon"
モジュールミキシング
混合モジュールの定数も利用できます:
module Mixin A = 123 end class Product include Mixin puts A end # 123
これはモジュールを含めるときに機能することに注意してください。拡張する場合は機能しません。
例 :
class Product extend Mixin puts A end # uninitialized constant Product::A
また :
モジュールからインクルードされたメソッドを使用すると、Rubyはそのメソッドが定義されている場所から始まる定数を探します。
例 :
module Parent def print_value VALUE end end class Child include Parent VALUE = 1 end # Works p Child::VALUE # uninitialized constant Parent::VALUE p Child.new.print_value
覚えておくべきことがあります!
モジュールの入れ子
ネストされたクラスを使用したもう1つの例を示します(モジュールについても同じです)。
class A FOO = 1 end class A::B class C puts FOO end end
A::B
に注目してください ここでの表記は、ショートカットとして使用しようとしました。しかし、問題はそのクラスC
FOO
にアクセスできなくなります 直接。
そのため、この種のネストに固執する必要があります:
class A FOO = 1 end class A class B class C puts FOO end end end
最初の例でも、::A::FOO
を実行できます。 定数にアクセスしますが、クラス名が変更されるとエラーが発生します。
この::A::FOO
構文が機能するのは、RubyにArray
のような定数が含まれるトップレベルのスコープを調べるように指示するためです。 &String
定義されています。
ビデオ
概要
いくつかの興味深い振る舞いをする変数の一種であるRuby定数について学びました。定数の値は変更できますが、警告が出力されます。
また、クラス名は定数であり、const_get
は避ける必要があることも学びました。 ユーザー入力あり。
この投稿を楽しんだら、共有することを忘れないでください 定数がどのように機能するかをより多くの人が理解できるようになります。
-
Bluetooth 5 について知っておくべきことすべて
Wi-Fi と同様に、Bluetooth はモバイルやその他のデバイスに不可欠な要素です。ファイルやデータの転送に使用されるだけでなく、スピーカー、スポーツ イヤホンなどのワイヤレス デバイスを接続することもできます。 Bluetooth は通信の方法を変えただけでなく、多くのデバイスをかさばるものからコンパクトなものに変えました。この新しいバージョンの Bluetooth では、以前のバージョンではできなかった多くのことが可能になります。ただし、新しいバージョンはそれほど例外的ではありません。しかし同時に、それはまだいくつかの新鮮なものをテーブルにもたらします.それでは、何が用意されている
-
PBM ファイルについて知っておくべきことは?
コンピューターが親しみやすいものになって以来、テクノロジーとエンターテインメントの分野で顕著な成長を目の当たりにすることができます。娯楽の最も一般的なソースの 1 つは、写真やその他のメディアです。ただし、現在のテクノロジでは、ファイルをサポートできる特定のツールを開くために正しいプログラムを選択する必要はありません。ただし、画像とその他のメディア ファイルは同じファイル タイプではなく、さまざまな拡張子が関連付けられていることを知っておくとよいでしょう。そのような拡張子の 1 つは、しばらくの間ユーザーの間で人気を集めている PBM ファイル拡張子です。今日は、PBM ファイルとその実行方法