理解Ruby和Sinatra语法

理解Ruby和Sinatra语法,ruby,sinatra,Ruby,Sinatra,我需要破译一些Ruby代码。作为一名Python开发人员,我很难理解一些语法 我需要处理一些(大部分是干净易读的)Sinatra代码。我从a开始,它看起来像这样: get '/' do "Hello, World!" end get('/', lambda { "Hello, World" }) 现在,我知道在Ruby中调用函数不需要括号。因此,如果我试图理解上述内容,我会说: get是一个函数,它的第一个参数是route “/”是第一个参数 做。。。end块是一个匿名函数 请纠正我

我需要破译一些Ruby代码。作为一名Python开发人员,我很难理解一些语法

我需要处理一些(大部分是干净易读的)Sinatra代码。我从a开始,它看起来像这样:

get '/' do
    "Hello, World!"
end
get('/', lambda { "Hello, World" })
现在,我知道在Ruby中调用函数不需要括号。因此,如果我试图理解上述内容,我会说:

  • get
    是一个函数,它的第一个参数是route
  • “/”
    是第一个参数
  • 做。。。end
    块是一个匿名函数
  • 请纠正我,如果我错了上面,并详细解释任何我可能遗漏

    他们还说Sinatra是一个DSL——这是否意味着它正在解析一些非官方Ruby的特殊语法。。。end(或
    {…}
    )是一个块,在Ruby中是一个非常重要的概念。需要注意的是,通常采用其他函数作为参数的函数(
    map
    filter
    grep
    timeout
    …)通常只接受一个函数。所以Ruby设计师决定为它制作一种特殊的语法

    人们常说,在Ruby中,一切都是对象。这并不完全正确:代码不是对象。代码可以包装到对象中。但是Ruby块是纯代码——不是对象,根本不是一阶值。块是与函数调用关联的一段代码

    您的代码段与此等效:

    self.get('/') do
        return "Hello, World!"
    end
    
    get
    方法采用一个参数和一个块;不是两个参数。在一个假设的例子中,
    get
    使用了两个参数,我们必须这样写:

    get '/' do
        "Hello, World!"
    end
    
    get('/', lambda { "Hello, World" })
    

    但是请注意,我们将代码包装到对象中的方法包括调用方法
    lambda
    Proc.new
    ——并给它们一个块(和零参数)

    有很多关于“Ruby块”的教程,所以我不会链接任何特定的教程

    由于块语法,Ruby非常擅长用方言(仍然是完全语法化的Ruby)非常简洁地表达某些概念。Sinatra使用
    get…
    “语法”(但实际上只是一个方法调用)来描述web服务器;Rake使用
    任务…
    语法来描述构建过程
    RSpec是一个测试框架,它有自己的DSL(仍然是Ruby)来描述所需的行为。。。end
    (或
    {…}
    )是一个块,在Ruby中是一个非常重要的概念。需要注意的是,通常采用其他函数作为参数的函数(
    map
    filter
    grep
    timeout
    …)通常只接受一个函数。所以Ruby设计师决定为它制作一种特殊的语法

    人们常说,在Ruby中,一切都是对象。这并不完全正确:代码不是对象。代码可以包装到对象中。但是Ruby块是纯代码——不是对象,根本不是一阶值。块是与函数调用关联的一段代码

    您的代码段与此等效:

    self.get('/') do
        return "Hello, World!"
    end
    
    get
    方法采用一个参数和一个块;不是两个参数。在一个假设的例子中,
    get
    使用了两个参数,我们必须这样写:

    get '/' do
        "Hello, World!"
    end
    
    get('/', lambda { "Hello, World" })
    

    但是请注意,我们将代码包装到对象中的方法包括调用方法
    lambda
    Proc.new
    ——并给它们一个块(和零参数)

    有很多关于“Ruby块”的教程,所以我不会链接任何特定的教程


    由于块语法,Ruby非常擅长用方言(仍然是完全语法化的Ruby)非常简洁地表达某些概念。Sinatra使用
    get…
    “语法”(但实际上只是一个方法调用)来描述web服务器;Rake使用
    任务…
    语法来描述构建过程
    RSpec
    是一个测试框架,它有自己的DSL(仍然是Ruby)来描述所需的行为。

    读了一些书后,我理解了代码块

    Ruby代码块很简单。它们是“闭包”。有两种方法可以编写块

    do |x|
      do_something(x)
    end
    
    {|x| do_something(x) }
    
    |x |
    是传递给块内代码的参数

    掌握代码块的关键在于理解它们是如何与方法一起使用的

    在Ruby中,方法有点不同

    • 除了参数,任何方法都可以接受代码块。
    • 代码块不是参数,但它们是一个单独的实体,可以与参数一起传递给方法
    • 方法可以选择不调用代码块,在这种情况下,将忽略传递的任何代码块
    • 如果一个方法调用一个代码块,那么在调用该方法时必须传递它,否则Ruby会抱怨
    • yield
      在方法中执行代码块

    有关代码块的更多信息,请阅读以下内容:

    经过一些阅读,我理解了代码块

    Ruby代码块很简单。它们是“闭包”。有两种方法可以编写块

    do |x|
      do_something(x)
    end
    
    {|x| do_something(x) }
    
    |x |
    是传递给块内代码的参数

    掌握代码块的关键在于理解它们是如何与方法一起使用的

    在Ruby中,方法有点不同

    • 除了参数,任何方法都可以接受代码块。
    • 代码块不是参数,但它们是一个单独的实体,可以与参数一起传递给方法
    • 方法可以选择不调用代码块,在这种情况下,将忽略传递的任何代码块
    • 如果一个方法调用一个代码块,那么在调用该方法时必须传递它,否则Ruby会抱怨
    • yield
      在方法中执行代码块
    有关代码块的更多信息,请阅读以下内容:

    您是正确的