3

私はRubyを学び始めており、おそらく当然のことながら、頭を包むのが最も難しいのはブロックです。

それらの使用例をいくつか見ると、それらのいくつかは不必要に複雑に見え、誰かがコードを難読化しようとしているように見えます。

たとえば、Railsからの移行コードは次のとおりです。

create_table :posts do |t|
    t.string :name
    t.string :title
    t.text :content
    t.timestamps
end

tが作成されたテーブルを参照していると仮定すると、これはこれとまったく同じではありませんか?:(より明確にするために括弧を追加しました)

t = create_table(:posts)
t.string(:name)
t.string(:title)
t.text(:content)
t.timestamps()

最初のバージョンはどのように「より良い」またはより明確ですか?

4

4 に答える 4

6

あなたの質問を裏返してください:最初のバージョンはどのようにもっと複雑ですか?

簡単な答え:一般的に、いいえ。ブロックは特定の目的を果たします。

IMOブロックは、次の理由でよりコミュニケーションがとれます。

  • ブロック内のすべてが関連しています
  • スコープは言語レベルで適用されます(tブロック後はこれ以上)

ブロックは、メソッドの前または後にコードを実行することもできますyield。たとえば、ファイルを生成するブロックはファイルを閉じることができます。

これらの追加された括弧は、何も明確にしません。Ruby(および同様の言語)の美しさの1つは、オプションの括弧によって、物事がより宣言的に見えるようになることです。これは、テーブル定義です。

于 2012-06-06T17:16:20.997 に答える
5

ブロックを使用する理由の1つは、ブロックの後に実行する必要があることがある場合です。

たとえばnow_commit_sql、SQLを実際にコミットしてテーブルを作成するには、呼び出されるプライベート移行メソッドを呼び出す必要があるとしますposts。リストした2番目の方法では、(メソッドを公開する必要があることt.now_commit_sql()に加えて)入力することを覚えておくのはユーザー次第です。now_commit_sql

ブロックの方法では、の後にyield、それを単独で呼び出すことができるため、よりシームレスになり、ユーザーにとってエラーが発生しにくくなります。さらに、Rails開発者が将来のバージョンで、またはあなたが持っているものなど、他のメソッドを呼び出す必要がある場合、ユーザーがに加えてlog_sql()呼び出すことを知っている必要はなく、そこに貼り付けることができます。t.log_sql().now_commit_sql()

于 2012-06-06T17:16:37.750 に答える
0

それはブロックなので、すべてのものが関連していることは一目で明らかです。2番目の例では、2回調べる必要があります。

于 2012-06-06T17:14:35.557 に答える
0

ブロックの本当の利点は、コードをパラメーターとして渡すことができることです。実行したいアクションをメソッドに与え、ある時点でそのメソッドがブロックを実行します。それが起こったとき、あなたからカプセル化される前後に何が起こるか、あなたはただあなたがメソッドに与えるコードに気を配る必要があります。

別の方法で実行できる状況はありますか?たぶん、しかし、あなたがブロックを変更するためにベースにするクラスは、それらがカプセル化されており、ブロックコードだけを気にする必要があるので、それについて心配したり、余分なアクションを実行したりする必要はありません。

于 2012-06-06T17:41:31.003 に答える