阻止没有变量

时间:2015-03-20 14:55:25

标签: ruby variables block

我遇到了一种我不太了解的语法。这是代码:

   config.middleware.insert_before 0, "Rack::Cors",:logger => (-> { Rails.logger }) do
      allow do
        origins '*'

        resource '/cors',
          :headers => :any,
          :methods => [:post],
          :credentials => true,
          :max_age => 0

        resource '*',
          :headers => :any,
          :methods => [:get, :post, :delete, :put, :options, :head],
          :max_age => 0
      end
    end

在第一行中do之后,没有声明变量,因为我们将在常规块中进行声明,例如:

array.each do |element| 
  puts element
end

我应该如何解释第一个例子?

4 个答案:

答案 0 :(得分:3)

这是一个不带块变量的块,或者块变量可以传递但不被使用的块。

答案 1 :(得分:0)

不必将块变量传递给块:

▶ def helloer &cb
▷   puts cb.call
▷ end  
# => :helloer
▶ helloer { 'Hello, world' }
Hello, world
# => nil

答案 2 :(得分:0)

块没有必要包含变量。检查一下,例如:

array = [1, 2, 3]
array.each do
  puts "Hello"
end
# => Hello
# Hello
# Hello

答案 3 :(得分:0)

当定义块时,您不确定使用的值是什么时,块变量很有用。但是,如果您已经可以访问这些值,则可以直接使用它们,而不是依赖传递给块的变量。

让我提供一些非常基本的例子:

# run the following code

class CB
  def self.show_num
    yield
  end
end

CB.show_num do
  1
end

如果您不知道将使用哪些值,您可以使块具有灵活性,即期望参数。

# run the following code

class CB
  CONSTA = 1
  CONSTB = 2

  def self.show_with_sign
    val = yield(CONSTA, CONSTB).round(2)
    "#{val}%"
  end
end

CB.show_with_sign do |num, den|
  100 * num.fdiv(den)
end

在您共享的代码中,所有信息都已存在于声明块的位置。换句话说,您已经拥有了为块生成输出的值。因此它按原样传递给方法,没有任何参数。