Ruby code blocks and Chef

后端 未结 2 637
半阙折子戏
半阙折子戏 2020-12-21 17:43

I am an extremely new person to Ruby and Chef. I have been trying to wrap my head around the syntax and do some research, but I am sure as you all know unless one knows the

相关标签:
2条回答
  • 2020-12-21 17:58

    If you come from another language (not Ruby), this syntax might seem very strange. Let's break down things.

    When calling a method with parameters, in most cases the parentheses are optional:

    • foo(bar) is equivalent to foo bar
    • foo(bar, baz) is equivalent to foo bar, baz

    A Ruby block of code can be wrapped in curly braces ({}) or inside a do..end block and can be passed to a method as its last parameters (but note that there's no comma and if you're using parentheses it goes after them. Some examples:

    foo(bar) { # code here }
    
    foo(bar) do
      # code here
    end
    
    foo bar do
      # code here
    end
    
    foo do
      # code here
    end
    

    In some cases, code blocks can receive parameters, but in Chef the resources' blocks never do. Just for reference, the syntax for that is:

    foo(bar) do |baz, qux|
      baz + qux
    end
    

    Specifically about Chef resources, their syntax is usually:

    resource_type(name) do
      attribute1 value1
      attribute2 value2
    end
    

    This means that, when you say:

    log "a debug string" do
      level :debug
    end
    

    you're actually creating a log resource whose name attribute is set to "a debug string". It can later be referred to (in other resources, for example) using log[a debug string].

    AFAIK, the name attribute is mandatory for every Chef resource type as it's what makes it unique, and allows you to, among other things, call actions on it after it has been declared.


    Side note: The ruby block is usually optional for a Chef resource. If you do something like:

    directory "/some/path"
    

    Chef will compile that resource using its default attributes (among which is action :create), and try to create the named directory using those.

    0 讨论(0)
  • 2020-12-21 18:08

    The do ... end here is not a usual ruby block statement.

    It's a implementation of DSL (Domain Specific Language).

    Here's a nice explanation [1]:

    there is the concept of an internal DSL, which uses the syntax of an exіsting language, a host language, such as Ruby. The means of the language are used to build constructs resembling a distinct language. The, already mentioned, Rake uses this to make code like this possible:

    task :codeGen do        
      # do the code generation      
    end
    

    Hope that answer your question.

    [1] : http://www.infoq.com/news/2007/06/dsl-or-not

    0 讨论(0)
提交回复
热议问题