【问题标题】:Definition of the get method in Sinatra (Ruby)Sinatra (Ruby) 中 get 方法的定义
【发布时间】:2016-01-01 22:31:01
【问题描述】:

在下面的 ruby​​ 代码中:

require 'sinatra'

class Stream
   def each
     100.times { |i| yield "#{i}\n" }
   end
 end

 get ('/') {Stream.new}
 get '/' do
   Stream.new
 end

第 9 行的代码和第 10-12 行的代码在功能上是等价的。

第 9 行的代码看起来没问题。它必须是一个体面的函数,参数 '/' 在括号内,代码在花括号内。

但是在第 10-12 行中,参数“/”没有括号。还是函数吗?如果它是函数,为什么它的参数不包含括号?

当我浏览 ~/.rbenv/versions/custom-2.0.0-p247/lib/ruby/gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb 这个“ get" 已定义,我发现:

       # Defining a `GET` handler also automatically defines
       # a `HEAD` handler.
       def get(path, opts = {}, &block)
         conditions = @conditions.dup
         route('GET', path, opts, &block)

         @conditions = conditions
         route('HEAD', path, opts, &block)
       end

看起来“get”被定义为可选的 {} 或 &block,为什么会这样?

当某些东西被定义为一个块时,Ruby 是否要求在参数周围不要有任何括号?

【问题讨论】:

  • 一个基本的 Ruby 教程可能会回答你的问题。
  • 感谢您的评论,但我已经有一本(印刷的)Ruby 书,很难找到关于这个特定主题的信息 :)
  • 该特定主题的信息在所有 Ruby 教程中都是相同的,因为它们讨论了方法、向它们传递参数以及使用带有方法的块。 Sinatra 没有做任何不同的事情,它使用 Ruby 的基本构建块。
  • 如果其中任何一个回答了您的问题,请将其标记为答案。

标签: ruby sinatra


【解决方案1】:

正如 Simone 指出的,括号在 ruby​​ 中是可选的,因此您的 get 方法可以在有或没有括号的情况下调用。

看起来“get”被定义为可选的 {} 或 &block,为什么会这样?

get 函数采用三个参数。第一个参数是path,第二个是Hash,默认值为空,第三个是块。

ruby 中的块可以写成{}do...end。因此,在您的两个示例中,您都将一个块传递给 get 函数

【讨论】:

    【解决方案2】:

    在 Ruby 中,方法周围的括号是可选的。一旦你定义了

    def foo(path)
    end
    

    您可以通过以下方式调用该方法:

    foo "/"
    foo("/")
    

    同样,有两种块语法。 {}do...end

    def foo(path, &block)
    end
    
    foo "/" { 'bar' }
    
    foo "/" {
      'bar'
    }
    
    foo "/" do
      'bar'
    end
    
    foo("/") { 'bar' }
    
    foo("/") {
      'bar'
    }
    
    foo("/") do
      'bar'
    end
    

    都是等价的。实际上,如果您考虑 {}do...end 相比的优先级,则存在一些细微差别,但在您的示例中您无需担心。

    【讨论】:

    • 一切正常,除了在参数中使用不带括号的 {}。我刚试过。我做了: get "/" {Stream.new} 它引发:语法错误,意外'{',期待输入结束看起来,{} 需要参数的括号,而 do...end 不需要't。
    【解决方案3】:

    Thoughtbot 写了一篇出色的博客,解释了how to build your own Sinatra from scratch。它回答了您的许多问题。

    Gabe-Berke Williams 逐步介绍并扩展了 15 行小类的功能。首先您使用标准方法名称,然后添加功能(参数、机架路由器等),然后创建一个允许您在全局命名空间中使用 get、post 等的 Delegator。

    【讨论】:

    • 这个问题根本与 sinatra 无关。这是关于非常红宝石的基础知识。
    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多