0

私はRuby構文の知識がほとんどなく、誰かが以下の関数を擬似コードに変換し、それがどのように呼び出されるかの例を提供してくれることを望んでいましたか?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
4

1 に答える 1

12

わお。それは醜いルビーです。

だからnumここに実際にありますString(ヒントは#sub#=~メソッドの使用です。

listArrayの_

  • Regexpオブジェクトおよび/または
  • Regexpと置換Stringオブジェクトのペア。

指定されたのいずれもRegexp文字列と一致しない場合、メソッドはを返しますnil

対になっていないRegexp文字列が一致する場合、メソッドはそれを返しますRegexp

ペアRegexpが文字列と一致する場合、メソッドはRegexp、ペアの置換テキストと一致する文字列の部分を置換し、変更されたを返しますString

が文字列とRegexp一致すると、メソッドは戻ります-それ以降Regexpのsは考慮されません。

いかなる場合でも、オリジナルはString変更されません。

それは非常に異なることをしようとしているので、それは本当にフランケンメソッド、IMHOです。

呼び出し例:

 in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
 in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
 in_list("abe lincoln", [ [/link/] ]) #=> nil

本当に、その多数のリターンタイプで、それはそれが価値があるよりもお尻の痛みのように思えます。

擬似コードで

  DEF IN - LISTtextregexps)
    FOREACH regexp IN regexps 
      IF HAS-MATCHtextregexp)
        IF HAS-REPLACEMENT-TEXTregexp)
          RETURN REPLACE-MATCHED-PORTIONtextregexpGET-REPLACEMENT-TEXTregexp))
        そうしないと
          正規表現を返す
        ENDIF
      ENDIF
    ENDFOREACH
    何も返さない-見つかった
  ENDDEF

しかし、私が言ったように、これはいくつかの醜いお尻のルビーです。私はそれを使用しないでしょう。これは、このコードにかなりの間違いがあることを私に告げるコードの臭いです。

の配列があり、テキストに一致する最初の配列Regexpsを見つけたい場合は、次のようにします。

# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/

置換テキストペアのコレクションがありRegexp、一部のテキストの最初の一致を置換したい場合は、これを実行します

# general case
text_dupe = text.dup
pairs.find { |re,replace| text_dupe.sub!( re, replace ) }
# example
text_dupe = "One two three four".dup
[ [/ape/, 'frog'], [/our/, 'my'] ].find { |re,replace| text_dupe.sub!( re, replace } } # would return "One two three fmy"

私はHash実際には最後にaを使用したいのですが、元のリストが入っていた順序が失われるため(そして、それがどのように使用されているかわからないので、それは重要ではないと私は言います)、私はしませんでした。

于 2009-07-15T11:03:47.750 に答える