2

コードの一部があります:

 def test_sub_is_like_find_and_replace
    assert_equal "one t-three", "one two-three".sub(/(t\w*)/) { $1[0, 1] }
 end

{ }中括弧の間に何があるかを理解するのは本当に難しいと思いました。誰か説明してくれませんか?

4

3 に答える 3

5

{...}ブロックです。Ruby は一致した値をブロックに渡し、ブロックの戻り値を文字列に置き換えます。String#subのドキュメントでは、これについてより完全に説明しています。

ブロック形式では、現在の一致文字列がパラメーターとして渡され、$1、$2、$`、$&、$' などの変数が適切に設定されます。ブロックによって返された値は、各呼び出しの一致に置き換えられます。

編集: マイケルのコメントによると、 について混乱している場合$1[0, 1]、これは最初のキャプチャ ( $1) を取得し、その部分文字列 (具体的には最初の文字) を取得するだけです。$1 は、正規表現の後の最初のキャプチャの内容に設定されたグローバル変数です (真の Perl 方式)。これは文字列であるため、#[]演算子は、インデックス 0 から始まる長さ 1 の部分文字列を取得するために使用されます。

于 2013-05-24T20:17:43.573 に答える
2

メソッドは 2 つのsub引数を取ります。1 つ目は置換するテキストで、2 つ目は置換です。または、1 つの引数は置換するテキストと、置換の処理方法を定義するブロックです。

ブロック メソッドは、置換を単純な文字列として定義できない場合に便利です。

例えば:

"foo".sub(/(\w)/) { $1.upcase }
# => "Foo"

"foo".sub(/(\w+)/) { $1.upcase }
# => "FOO"

メソッドはgsub同じように機能しますが、複数回適用されます。

"foo".gsub(/(\w)/) { $1.upcase }
# => "FOO"

いずれの場合も、$1括弧で囲まれた内容を指します(\w)

あなたのコード、図解

r = "one two-three".sub(/(t\w*)/) do 
  $1 # => "two"
  $1[0, 1] # => "t"
end

r # => "one t-three"
于 2013-05-24T20:19:47.903 に答える
0

subその中に正規表現を取り入れています。は$1、正規表現の一致を含む予約済みのグローバル変数です。

角かっこは、ブロックによって返された文字列で一致を置き換えるために使用されるコードのブロックを表します。この場合

puts $1
#=> "two"
puts $1[0, 1]
#=> "t"
于 2013-05-24T20:21:32.507 に答える