Ruby1.9.3について質問です。

Stringのdeleteメソッドの動作規則が分かりません。

"hello".delete("l", "lo")とした場合、「heo」となります。
"hello".delete("l", "o")とした場合、「hello」となります。

私が動かして確認してみた結果、引数で指定された文字列中の重複する文字だけが削除されるという認識になりました。

これは正しいでしょうか?
また、何のため第二引数以降を指定するのでしょうか?
第一引数に削除したい文字をすべて指定すればいいのではと思います。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2011/12/11 00:13:41
  • 終了:2011/12/11 01:00:41

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4487ベストアンサー獲得回数18562011/12/11 00:37:59

ポイント50pt

私が動かして確認してみた結果、引数で指定された文字列中の重複する文字だけが削除されるという認識になりました。

これは正しいでしょうか?

ある意味、正しいです。

ruby のドキュメントからの引用です。
http://doc.ruby-lang.org/ja/1.9.3/class/String.html

なお、引数を複数指定した場合は、すべての引数にマッチする文字だけが削除されます。

「ある意味」と書いたのは、"^" の表現があるからです。

また、何のため第二引数以降を指定するのでしょうか?

引数がひとつだけだと、表現できないケースがあります。

"^0-9" のように文字列の先頭が `^' の場合は指定文字以外を意味します。

delete の引数を定数で指定できない場合(プログラムの結果で導き出される)で、且つ、ひとつは "^" を指定したくなる場合。
例えば、5よりも大きくて、素数では無い数字を削除したい場合、素直に表現すると以下のようになります。
str.delete("5-9", "^2357")
ふたつの条件から、"5689" という文字列を作って、
str.delete("5689")
としても同じことですが、その文字列を作る手間を delete に任せることができます。

その他の回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4487ベストアンサー獲得回数18562011/12/11 00:37:59ここでベストアンサー

ポイント50pt

私が動かして確認してみた結果、引数で指定された文字列中の重複する文字だけが削除されるという認識になりました。

これは正しいでしょうか?

ある意味、正しいです。

ruby のドキュメントからの引用です。
http://doc.ruby-lang.org/ja/1.9.3/class/String.html

なお、引数を複数指定した場合は、すべての引数にマッチする文字だけが削除されます。

「ある意味」と書いたのは、"^" の表現があるからです。

また、何のため第二引数以降を指定するのでしょうか?

引数がひとつだけだと、表現できないケースがあります。

"^0-9" のように文字列の先頭が `^' の場合は指定文字以外を意味します。

delete の引数を定数で指定できない場合(プログラムの結果で導き出される)で、且つ、ひとつは "^" を指定したくなる場合。
例えば、5よりも大きくて、素数では無い数字を削除したい場合、素直に表現すると以下のようになります。
str.delete("5-9", "^2357")
ふたつの条件から、"5689" という文字列を作って、
str.delete("5689")
としても同じことですが、その文字列を作る手間を delete に任せることができます。

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/12/11 00:39:50

ポイント25pt

引数が複数ある場合はいずれにもマッチする文字が削除対象となりますので、
"hello".delete("l", "lo") であれば、
どちらにも含まれている"l"が削除対象となり結果は"heo"となりますが、
"hello".delete("l", "o") には、同じ文字が含まれていないため、
削除対象となる文字が無く結果は"hello"のままとなるわけです

id:satoxu No.3

satoxu回答回数94ベストアンサー獲得回数142011/12/11 00:53:59

ポイント25pt

一部正しいのですが、少しだけ勘違いがあります。

str.delete の第一引数に"lo"を指定した場合には、l もしくは o と解釈されます。

引数を複数指定した場合、各引数は∩(かつ)の関係で解釈されます。

つまり、

"hello".delete("lo") -> l か o を削除 -> he

"hello".delete("l", "lo") -> l かつ l か o -> heo(lかつlのみ削除)

"hello".delete("l", "o") -> l かつ o -> hello(該当なし)

となります。

もしも特定の文字列(lo、lloなど)を削除した場合には、delete ではなく、subか
gsubを使用された方がよいかと思います。

$test = "hello".sub("lo", "") -> hel(loを何もなしに置換)

$test = "hello".sub("l", "") -> helo(最初のlのみ何もなしに置換)
$test = "hello".gsub("l", "") -> heo(すべてのlを何もなしに置換)

sub と gsub の違いは「最初にマッチしたものだけ置換するか、すべてを置換するか」です。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません