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

Ruby変換メソッドの使用方法(to_s、to_a、to_str)

整数を使用していますが、文字列メソッド(gsubなど)を使用したい )代わりに。

何ができますか?

文字列に変換します(to_sを使用) )次に、整数に変換し直します(to_iを使用) 。

Integerを変換できます 1からString 「1」。

次に、新しいクラスのメソッドを使用できます。これにより、以前は不可能だったことができます。

Rubyでは…

すべてのオブジェクトはクラスに関連付けられており、すべてのクラスには特定のメソッドのセットがあります。

この記事では、について学びます

  • Rubyで使用できる変換方法
  • それらの違いは何ですか!
  • さまざまな状況で適切なものを選択する方法

やってみましょう!

短い変換方法(to_s、to_i)

あなたはおそらく、この最初の変換方法のグループに精通しているでしょう。

次のような方法

  • to_i
  • to_s
  • to_a

これらのメソッドは、現在のオブジェクトを表す特定のクラスの新しいオブジェクトを返します。

(1..10).to_a

# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

これは言う

Rangeを変換したい 1..10をArrayに それはその範囲を表しています。」

Rubyがこれらの変換メソッドを暗黙的に呼び出す方法がいくつかあります。

文字列補間のように:

"#{1}"

これは1.to_sを呼び出します 見えなくてもあなたのために。

このコードで自分自身を確認できます

module Log
  def to_s
    puts "to_s called"
    super
  end
end

class Integer
  prepend Log
end

puts "#{1}"
# "to_s called"

Fixnumを使用する必要があります Integerの代わりに Ruby2.3以前を使用している場合。または、Rubyバージョンを更新してください🙂

これらのメソッドはかなり寛容であり、例外を発生させることは想定されていません。

"aaaaaa".to_i

# 0

この0 驚かれるかもしれません。

ただし、to_iを呼び出すとそれが得られます 整数のない文字列。

この記事の後半で説明するように、このメソッドにはより厳密なバージョンがあります

長い変換方法(to_str、to_int)

今:

これらの短い変換メソッドがある場合、なぜto_strのようなメソッドが必要なのですか。 、またはto_int

違いは何ですか?

違いは彼らの意図にあります。

すべてのRubyクラス(BasicObjectを除く) )to_sを実装します ある種の文字列表現として自分自身を返すメソッド。

ただし、クラスが文字列を返すからといって、文字列のように動作するわけではありません。

例を見てみましょう

"" + 1
# TypeError: no implicit conversion of Fixnum into String

これについて考えてください

空の文字列と整数は何を返す必要がありますか?

わかりません。

「1」(番号が1の文字列)と言うことができます。

しかし、なぜですか?

この場合、ほとんどの人が期待することではありません。

それらを合計しても意味がありません… そのため、このTypeErrorが発生します 。

そしてそれが許されたとしても。

これはどうですか

"" + {}

これは、空の文字列と空のハッシュです。

どちらも意味がありません!

したがって、Rubyは、他のオブジェクトが文字列であるかどうかをチェックするのではなく、ポリモーフィズムには適していないので、文字列のようにACTSするかどうかをチェックします。

ここでto_str メソッドが入ります。

Ruby2.5でto_strを実装する唯一のクラス

  • String
  • NameError::message
  • Warning::buffer

独自の変換メソッドを実装する方法

to_strを実装できます どのクラスでも。

そうすれば、文字列のように使用できるようになります。

ここに例があります

class Cat
  def to_str
    "meow"
  end
end

"" + Cat.new

# "meow"

ただし、クラスが文字列と同等でない限り、これを行うべきではありません

to_sを使用する 代わりに。

ところで、これは+だけのものではありません メソッド。

文字列のようなオブジェクトだけが意味をなす他の場所でも使用されます。

いいね

[1,2,3].join(",")

to_intのような他の長い変換方法 &to_hash 同じ論理に従います。

そのため、これらのさまざまな方法があります。

変換ラッパーの使用方法

まだ十分な変換方法がない場合でも…もう少しありますのでご安心ください!

私はこれらを「コンバージョンラッパー」と呼んでいます。

彼らは

  • Array()
  • Integer()
  • ハッシュ[]

それはまさにそこにあるいくつかの変わった方法です!

括弧と角かっこに注意してください…

…これらのメソッドをクラス名から分離するのはこれだけです。

これらの目的は何ですか?

Array()は何でも配列に変換します。

ここにいくつかの例があります

Array(nil)
# []

Array([])
# []

Array(1)
# [1]

Array("")
# [""]

これはどのような論理ですか???

この方法は、非常に具体的な一連のルールに従います。 :

  • オブジェクトがto_aryに応答する場合 、またはto_a それを呼び出して値を返します
  • それ以外の場合は、オブジェクトを空の配列内に配置し、それを返します

これが上記の動作の説明です。

これは、配列を期待するメソッドを作成しているが、他の何かを取得して、メソッドがアプリケーション全体をクラッシュさせる可能性がある場合に役立ちます。 Array()に渡すことで、配列であることを確認できます。 最初にそれを避けてください。

Integer()

いくつかの特別なルールがあります

  • オブジェクトが文字列であり、文字列の内容がRubyの有効な数値表現に厳密に準拠している場合、このメソッドは整数を返します。 ArgumentErrorを発生させます フォーマットが無効な場合。
  • オブジェクトが文字列でない場合は、to_intを呼び出そうとします 、次にto_i
  • TypeErrorが発生します オブジェクトを有効なIntegerに変換できない場合 変換方法を使用します。

Integer(1)
# 1

Integer("25")
# 25

Integer("abc123")
# ArgumentError (invalid value for Integer(): "abc123")

Integer([])
# TypeError (can't convert Array into Integer)

このInteger() このメソッドは、有効なIntegerを使用していることを100%確認したい場合に便利です。 。

Hash[]

偶数要素の配列を渡すことができます 新しいハッシュを取得するには:

Hash[[["a", 1], ["b", 2], ["c", 3]]]

# {"a"=>1, "b"=>2, "c"=>3}

2つの配列の要素をマージするか、mapなどのメソッドを使用してハッシュを作成する場合に便利です。

概要

Rubyのさまざまな変換方法、それらが存在する理由、およびそれらの使用方法について学習しました。

これがお役に立てば幸いです🙂

この記事を楽しんだら、私の本、RubyDeepDiveも気に入るはずです。ぜひチェックしてください。


  1. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた

  2. Rubyの配列クラスの使用方法(例+便利なメソッド)

    アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ