没有变量的块
Block without variable
我遇到了一个我不太理解的语法。这是代码:
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
我应该如何解释第一个例子?
它是一个不接受块变量的块,或者一个块变量可以传递到但不被使用的块。
不强制将块变量传递给块:
▶ def helloer &cb
▷ puts cb.call
▷ end
# => :helloer
▶ helloer { 'Hello, world' }
Hello, world
# => nil
块不一定要有变量。看看这个,例如:
array = [1, 2, 3]
array.each do
puts "Hello"
end
# => Hello
# Hello
# Hello
当您在定义块时不确定使用的值是什么时,块变量很有用。但是,如果您已经可以访问这些值,则可以直接使用它们,而不是依赖传递给块的变量。
让我提供一些非常基本的例子:
# 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
在您共享的代码中,所有信息都已存在于声明块的位置。简而言之,您已经拥有为块生成输出的值。因此它按原样传递给方法,没有任何参数。
我遇到了一个我不太理解的语法。这是代码:
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
我应该如何解释第一个例子?
它是一个不接受块变量的块,或者一个块变量可以传递到但不被使用的块。
不强制将块变量传递给块:
▶ def helloer &cb
▷ puts cb.call
▷ end
# => :helloer
▶ helloer { 'Hello, world' }
Hello, world
# => nil
块不一定要有变量。看看这个,例如:
array = [1, 2, 3]
array.each do
puts "Hello"
end
# => Hello
# Hello
# Hello
当您在定义块时不确定使用的值是什么时,块变量很有用。但是,如果您已经可以访问这些值,则可以直接使用它们,而不是依赖传递给块的变量。
让我提供一些非常基本的例子:
# 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
在您共享的代码中,所有信息都已存在于声明块的位置。简而言之,您已经拥有为块生成输出的值。因此它按原样传递给方法,没有任何参数。