7

私は約 2 週間 Ruby を使用しており、プログラミングをそれほど長く行っていませんが、C スタイルのバックグラウンド (C++、C# など) からこの言語に取り組んでいます。とにかく、私の良き友人であり指導者でもある人が、私が先日書いた Ruby を見ていて、Ruby で中括弧を使っているのを見つけたら、私を叩くと言っていました。

昨日、この About.com の記事で Builder について知りました。彼らが投稿した例では中括弧が使用されています。これを行う別の方法はありますか、それともビルダーで中括弧を使用する必要がありますか?

これは些細なことのように思えるかもしれませんが、私は Ruby を初めて使用するので、悪い習慣を身に付けたくありません。皆さんはどう思いますか?

4

4 に答える 4

11

「ワンライナーにはブレース、マルチライナーにはドエンド」を使用する人もいますが、個人的には次のルールが最も論理的だと思います。

  • do-endブロックに副作用がある場合に使用します (通常は witheachおよび関連するメソッド) 。
  • ブロックに副作用がない場合はブレースを使用します (mapなどinject) 。

このロジックは、Matt が書いたメソッド チェーンの問題によく合います。

このアプローチの利点の 1 つは、ブロックを記述するたびに副作用について考えさせられることです。副作用は非常に重要ですが、関数型プログラミングのバックグラウンドを持たないコーダーには見落とされることがあります。

副作用の用語を含まない別の言い方をすると、次のようになります。

  • 実行do-endするブロックに使用
  • 返すブロックに{andを使用}

詳細情報を含むいくつかの記事を次に示します。

http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc

http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace

于 2011-03-02T17:03:13.890 に答える
10

慣用的なルビーは

method_name {|param| param.do_something} # squigglies for one liners

# do/end for multi-line
method_name do |param|
  param.do_something
end

これの理由の1つは、連鎖するためであり、見栄えが良く、類似foo.map {|f| f.num}.reduce(0) {|memo, i| memo + i}のメソッド呼び出しをぶら下げることです。end

foo.map do |f| 
  f.num
end.reduce(0) do |memo, i| 
  memo + i
end

end構文的には2つは同等ですが、からメソッドを呼び出すことには奇妙なことがあります。

于 2011-03-02T16:25:05.617 に答える
4

通常の規則は、ワンライナーとマルチ{ ... }ライナーのブロックです。私は一般的にこの慣習に従いますが、私が王様になったら、もっと頻繁do ... endに使用すると思います.do .. end

ときどき問題になるの{}は、パラメータをも持つメソッドに対して詩モードのブロックを記述する唯一の方法は、 を使用することです。そうしないと、ブロックはパラメータの一部になり、メソッドに直接渡されません。方法。{}do enddo end

def f x
  yield x
end

f 123 do |n| p n end  # works
f 123  { |n| p n }    # does not work
f(123) { |n| p n }    # works, of course

もちろん、詩モードでブロックをパラメーターにアタッチしたい場合は、 で勝ちます。{}do end

def g  ; p ['g', yield] end
def f x; p ['f', yield] end

f g { 2 } do 3 end
["g", 2]
["f", 3]

最後に、ここで受け取ったいくつかのアドバイスに反して、 の前に a;は必要ありませんend

于 2011-03-02T18:10:01.983 に答える
-2

「ルビーウェイ」は特定のスタイルを支持していません。彼らがあなたに中括弧を使用するオプションを持たせたくないのなら、それはその言語ではないでしょう。そうは言っても、チームのコーディングスタイルに準拠します(チームで作業している場合)。

私が見たほとんどのRubyコードendは中括弧の代わりに使用していますが、Rubyを使用していないため、これが好ましいスタイルであるかどうかはわかりません。Rubyには複数の方法があります。(理由の範囲内で)好きな方法で使用できます。

于 2011-03-02T16:25:55.797 に答える