この "do ... end"の意味は何ですか?

私はRubyを初めて使い、既に書かれたコードを読むことから学びます。 私はこのコードに遭遇する:

label = TkLabel.new(@root) do
    text 'Current Score: '   
    background 'lightblue'
end

上記の構文 "do"の意味は何ですか? 私はそれを使って遊んだので、TkLabelオブジェクトを作成して、そのクラス変数のテキストと背景を引用符で指定されたものに設定するように思えます。しかし、私が作成したクラスに同じことをしようとしたとき、それはうまくいきませんでした。

ああ、また、関数にハッシュを渡すことについて、

object.function('argument1'=>123, 'argument2'=>321)

どのように私はそのような議論を受け入れる関数を作るのですか?

前もって感謝します

1

2 答え

あなたが見ていることは、一般的にDSLまたはドメイン固有言語と呼ばれています。

一見すると、 text background が一見して定義されていないので、あなたが見えるコードがうまく動作する理由は明確ではないかもしれませんが、彼らがいる範囲。それは簡単ですが、それを駆動するコードは次のようになります。

class TkLabel
  def initialize(root, &block)
    @root = root

    if block
      # the code inside the block in your app is actually
      # evaluated in the scope of the new instance of TkLabel
      instance_eval(&block)
    end
  end

  def text(value)
    # set the text
  end

  def background(value)
    # set the background
  end
end
4
追加された

2番目の質問が最初に:それはちょうどハッシュです。単一の引数を受け取り、ハッシュのように扱う関数を作成します。

「セマンティクス」とは、ブロック( do ... end ビット)を受け入れる initialize と、特定の属性を設定する文字列パラメータを受け入れるメソッドです。

あなたがそれをやろうとしたことを知らずに、それをはるかに越えることは難しいです。 数少ない可能参考文献を参照してください。

Rubyは、ブロックを受け入れる能力とそのために許されているため、ミニチュアの作成にはまともです(内部DSL )もし時々秘密ならば)構文。

2
追加された
@BlackSoilこれは、複数のパラメータを持つメソッドに過ぎません。単一のハッシュがあれば、最後に置いてください - 呼び出し側はブラケットを必要としません。複数のハッシュがある場合、またはハッシュが最後の引数でない場合、呼び出し側は最後のものを除くすべてのハッシュ(角括弧)を必要とします。
追加された 著者 Dave Newton,
こんにちは、その引数のいくつかがハッシュの形式であり、他のいくつかが正規の引数である関数についてはどうでしょうか。私はこの種の関数呼び出しに遭遇しました。どのようにそれを実装するための任意のアイデア?例は本当に高く評価されるだろう..事前に感謝..
追加された 著者 BlackSoil,