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

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だけです。 オブジェクト自体を変更することからあなたを守ります。

一定の方法

定数の操作専用の方法がいくつかあります:

メソッド 説明 クラスで定義された定数を表すシンボルの配列を返します 定数の値を返します。パラメータとして記号または文字列を取ります 定数の値を設定します。シンボルとしての定数名と定数値の2つのパラメータを取ります 定数を削除します
定数
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メソッドがあります。 ただし、セキュリティチェックは行われないことに注意してください。

虎の巻

Ruby定数について知っておくべきことすべて

ルビー定数スコープ

クラスの外部で、コードのトップレベルで定数を作成すると、その定数はどこでも使用できるようになります。

定数は子クラスでも使用できます。

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は避ける必要があることも学びました。 ユーザー入力あり。

この投稿を楽しんだら、共有することを忘れないでください 定数がどのように機能するかをより多くの人が理解できるようになります。


  1. Bluetooth 5 について知っておくべきことすべて

    Wi-Fi と同様に、Bluetooth はモバイルやその他のデバイスに不可欠な要素です。ファイルやデータの転送に使用されるだけでなく、スピーカー、スポーツ イヤホンなどのワイヤレス デバイスを接続することもできます。 Bluetooth は通信の方法を変えただけでなく、多くのデバイスをかさばるものからコンパクトなものに変えました。この新しいバージョンの Bluetooth では、以前のバージョンではできなかった多くのことが可能になります。ただし、新しいバージョンはそれほど例外的ではありません。しかし同時に、それはまだいくつかの新鮮なものをテーブルにもたらします.それでは、何が用意されている

  2. PBM ファイルについて知っておくべきことは?

    コンピューターが親しみやすいものになって以来、テクノロジーとエンターテインメントの分野で顕著な成長を目の当たりにすることができます。娯楽の最も一般的なソースの 1 つは、写真やその他のメディアです。ただし、現在のテクノロジでは、ファイルをサポートできる特定のツールを開くために正しいプログラムを選択する必要はありません。ただし、画像とその他のメディア ファイルは同じファイル タイプではなく、さまざまな拡張子が関連付けられていることを知っておくとよいでしょう。そのような拡張子の 1 つは、しばらくの間ユーザーの間で人気を集めている PBM ファイル拡張子です。今日は、PBM ファイルとその実行方法