我是 ruby 和 rails 的新手。有人可以指出以下构造是什么。我在方法 (def) 中看到了 respond_to 构造。那么它是方法中的方法吗?我的意思是我试图理解这里的语言结构。
我确实了解它的功能,即以给定格式发送响应。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
我是 ruby 和 rails 的新手。有人可以指出以下构造是什么。我在方法 (def) 中看到了 respond_to 构造。那么它是方法中的方法吗?我的意思是我试图理解这里的语言结构。
我确实了解它的功能,即以给定格式发送响应。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
语言结构是一个红宝石块。但是,如果您真的想了解respond_to
这里的博客文章,它提供了一个很好的概述
要理解的关键是,respond_to 是附加到控制器超类的方法:ActionController,我们将作为参数传入称为块的东西:
...
在 respond_to 方法中,我们最终得到一个带有一个参数的 Proc。该参数调用了 .xml 和 .html 方法。当我们从 respond_to 内部调用 Proc 时,我们将什么作为参数传递给它?我们传入一个 Responder 类的实例。
因此,我们最终在响应程序类的实例上调用 .html 和 .xml,因为它被传递到 respond_to 方法内的块(已转换为 Proc)……唷。
是关闭。这就像在其他语言中传递一个函数,即在 Ruby 中,您有两个选项来迭代集合:
for elem in collection
# do something
end
或者
collection.each do |elem|
# do something
end
这两者之间是有区别的,但我不在这里描述它。如您所见,这就像将一个函数传递给该方法并在其中运行它。但是也有两种传递block的方法,使用do |variables| ... end
block或者{ |variables| ... }
block。如果您想编写自己的接受块的方法,那么有不止一种方法可以做到(它们有点不同,但会以相同的方式运行):
def run_3_times
yield
yield
yield
end
或者
def run_3_times(&block)
block.call
block.call
block.call
end
它们都被称为相同的方式:
run_3_times { puts 'hello' }
# will yield
hello
hello
hello
但是当块没有通过时会导致另一个错误:
# when using yield
LocalJumpError: no block given (yield)
# when using Proc.call
NoMethodError: undefined method `call' for nil:NilClass
from (pry):8:in `run_3_times'
这里有一些关于它的文章:
在 Ruby .respond_to 上? 是一种测试方法。其中一件事是接受一个符号,如果对象可以接收方法则返回true ,否则返回false。
例如:
[1, 2, 3].respond_to?(:push)
将返回true,因为您可以在数组对象上调用.push 。但是
[1, 2, 3].respond_to?(:to_sym)
会返回false,因为您不能将数组转换为符号
链接:
a] Ruby 面向的是方法调用的答案,而不是对象的类型。
回应?