freezeメソッド
freeze -> self[permalink][rdoc][edit]
オブジェクトを凍結(内容の変更を禁止)します。
凍結されたオブジェクトの変更は例外 FrozenError を発生させます。いったん凍結されたオブジェクトを元に戻す方法はありません。
凍結されるのはオブジェクトであり、変数ではありません。代入などで変数の指すオブジェクトが変化してしまうことは freeze では防げません。 freeze が防ぐのは、 `破壊的な操作' と呼ばれるもの一般です。変数への参照自体を凍結したい場合は、グローバル変数なら Kernel.#trace_var が使えます。
a1 = "foo".freeze
a1 = "bar"
p a1 #=> "bar"
a2 = "foo".freeze
a2.replace("bar") # can't modify frozen String (FrozenError)
a1 = "foo".freeze
a1 = "bar"
p a1 #=> "bar"
a2 = "foo".freeze
a2.replace("bar") # can't modify frozen String (FrozenError)
凍結を解除することはできませんが、Object#dup を使えばほぼ同じ内容の凍結されていないオブジェクトを得ることはできます。
a = [1].freeze
p a.frozen? #=> true
a[0] = "foo"
p a # can't modify frozen Array (FrozenError)
b = a.dup
p b #=> [1]
p b.frozen? #=> false
b[0] = "foo"
p b #=> ["foo"]
a = [1].freeze
p a.frozen? #=> true
a[0] = "foo"
p a # can't modify frozen Array (FrozenError)
b = a.dup
p b #=> [1]
p b.frozen? #=> false
b[0] = "foo"
p b #=> ["foo"]
even?メソッド
自身が偶数であれば真を返します。そうでない場合は偽を返します。10.even? # => true
5.even? # => false
include?メソッド(array,string)
arrayのincludeメソッド include?(val) -> bool 配列が val と == で等しい要素を持つ時に真を返します。[PARAM] val:
オブジェクトを指定します。
例
a = [ "a", "b", "c" ]
a.include?("b") #=> true
a.include?("z") #=> false
include?(substr) -> bool
文字列中に部分文字列 substr が含まれていれば真を返します。
[PARAM] substr:
検索する文字列
例
"hello".include? "lo" #=> true
"hello".include? "ol" #=> false
"hello".include? ?h #=> true
while
Rubyにおける「while」は、条件が真である限り、繰り返し処理を行うための制御構造です。基本的な構文は以下の通りです:
while 条件 do
# 繰り返し実行する処理
end
この構文では、まず「条件」が評価され、真の場合に処理が実行されます。その後、再び「条件」が評価され、真の場合に処理が実行されます。このプロセスが条件が偽になるまで続きます。
例を使って説明しましょう。次のコードは、変数「count」の値が10未満の間、ループ内の処理を繰り返します。
count = 0
while count < 10 do
puts count
count += 1
end
このコードは、0から9までの数字を順番に出力します。最初のループでは「count」の値は0ですが、条件「count < 10」が真であるため、処理が実行されます。処理の最後で「count」の値が1増え、再び条件が評価されます。これが条件が偽になるまで繰り返されます。
また、Rubyには「while」の他にも、「until」という制御構造もあります。これは条件が偽である限り処理を繰り返します。以下に例を示します
count = 0
until count >= 10 do
puts count
count += 1
end
このコードも先ほどの例と同じ結果を得ることができます。最初のループでは「count」の値が0であり、条件「count >= 10」が偽であるため、処理が実行されます。ループごとに「count」の値が増え、条件が偽になるまで繰り返されます。
「while」と「until」はどちらも繰り返し処理を実行するための制御構造ですが、条件の評価のタイミングが異なる点に注意してください。
valid?メソッド
オブジェクトがある条件を満たしているかどうかを判断するために使用されるメソッドです。このメソッドは一般的に、オブジェクトの妥当性をチェックするためにモデルクラスやデータオブジェクトなどで使用されます。
「valid?」メソッドは、主にActive Recordと呼ばれるRuby on Railsのデータベースアクセスのためのライブラリで利用されます。しかし、Rubyの他のコンテキストでもオブジェクトの妥当性をチェックするために自分で実装することができます。
一般的な使用方法は次の通りです:
object.valid?
「object」は「valid?」メソッドを呼び出す対象のオブジェクトです。
このメソッドを呼び出すと、オブジェクトが定義された妥当性のチェックルールに従って検証されます。通常、オブジェクトにはバリデーションルールが設定されており、これには属性の値が有効であるかどうかを判断するためのルールが含まれます。バリデーションには、値の存在、データ型、範囲の妥当性など、さまざまなチェックが含まれることがあります。
「valid?」メソッドは、オブジェクトが妥当な場合には「true」を返し、妥当でない場合には「false」を返します。また、妥当でない場合はエラーメッセージを格納するためのエラーオブジェクトが作成され、オブジェクトの「errors」メソッドを通じてアクセスできるようになります。
以下は、Active Recordモデルの例を示します:
class User < ActiveRecord::Base
validates :name, presence: true
validates :email, presence: true, uniqueness: true
end
user = User.new(name: "John", email: "john@example.com")
puts user.valid? # => true
user2 = User.new(name: nil, email: "john@example.com")
puts user2.valid? # => false
puts user2.errors.full_messages # => ["Name can't be blank"]
この例では、「User」というモデルクラスが定義されています。そのモデルには「name」と「email」という属性があり、それぞれのバリデーションルールが設定されています。最初の「user」オブジェクトはバリデーションを通過し、「true」が返されます。しかし、2番目の「user2」オブジェクトは「name」が空であるためバリデーションに失敗し、「false」が返されます。さらに、「user2.errors.full_messages」を通じてエラーメッセージを取得することもできます。