Ruby on rails 积木的用途是什么?
请给出如何、在哪里以及为什么使用Ruby on rails 积木的用途是什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,请给出如何、在哪里以及为什么使用块的实际示例 # Block Method def say_hello(&block) puts "hello!" block.call end say_hello { puts "hello again!" } #=> hello!, hello again! # Standard Method def say_hello(block) puts "hello!" puts block end say_hello(
块的实际示例
# Block Method
def say_hello(&block)
puts "hello!"
block.call
end
say_hello { puts "hello again!" }
#=> hello!, hello again!
# Standard Method
def say_hello(block)
puts "hello!"
puts block
end
say_hello("hello again!")
#=> hello!, hello again!
很明显,这个例子并没有起到任何作用。谢谢你的帮助
- 如何:
def say_hello(&block)
name = current_user.name
res = block.call(name)
res =+ ". and buy a car"
raw res
end
say_hello do |name|
"<div class='x1' > #{ name } </div>"
end
say_hello do |name|
"Hi #{name}"
end
say_hello do |name|
if name == 'Jack'
'U are so ugly'
else
name
end
end
def说你好(&block)
name=当前用户名
res=block.call(名称)
res=+“.买辆车”
原始资源
结束
说“你好,你叫什么名字?”|
“#{name}”
结束
说“你好,你叫什么名字?”|
“嗨#{name}”
结束
说“你好,你叫什么名字?”|
如果name=='Jack'
“你真丑”
其他的
名称
结束
结束
- 其中:
say_hello
方法在Rails助手中定义
在Rails视图中使用
- 原因:
灵活性,您不必创建只更改格式的新方法,也不必创建大量蹩脚的方法(对杰克说你好,对html说你好…)
在各种情况下,块都是很好的候选块
在某些情况下,块不是您所看到的唯一解决方案,您可能已经能够在没有块的情况下执行类似的执行。例如,下面的ActiveRecord模型语句就是这种情况
User.create! do |u|
u.email = "example@example.com"
u.password = "password"
end
无障碍
u = User.new
u.email = "example@example.com"
u.password = "password"
u.save!
或
一般来说,可以说块使代码更加简洁易读
File.open("file.txt") { |f| f.write("text") }
乍一看可以改写为
f = File.open("file.txt")
f.write("text")
f.close
这确实更加冗长。但还有更多。事实上,在块示例中,变量f
是一个局部块变量,在范围外不可见。这是模块最有趣的方面之一:范围界定
但还有更多。我最喜欢用积木做包装。假设您想要执行一个可能失败的代码块。当代码失败时,您希望在引发错误之前释放资源。你可以用积木
def safe
yield
ensure
# clean the house
end
事实上,这正是传递块时File.open
所做的。如果执行被包装在一个块中,在失败的情况下,该方法确保关闭文件处理程序,这样您就不会留下打开的文件连接
另一个很好的例子是Timeout
库
require 'timeout'
status = Timeout::timeout(5) {
# Something that should be interrupted if it takes more than 5 seconds...
}
如果要在执行未在合理时间内结束时引发错误,可以将代码包装在块中。该块启动一个并行线程,该线程统计执行时间,如果块内的代码没有在线程结束之前结束,则引发
我要求您实现相同的代码而不使用块。那肯定很难
一般来说,块允许您为方法构造一个通用框架,该框架可以通过传递块在运行时进一步定制。这类示例(可枚举的方法,如每个,超时,基准.ms
等)可能是理解块的威力的最好示例。这意味着什么?你是说每个
都是一个块方法
?就像在spired:Yes中定义为def each(&var).
@一样。你没看见那街区正在通过吗?(尽管很有可能有人在Ruby中实现它,它将被定义为yield
和block\u给定?
,而不是用&block
语法包装块。)@in spired:Yep。(或者至少相当于它的东西。)它穿过数组,依次将每个项目交给块。这很酷,每个
实际上是如何在源代码中编码的?因为我不能说例如:人。说你好
我们不是只允许说说你好{…}
?回答得很好。谢谢你的洞察力。现在开始有意义了!:)“真实生活的例子”?用红宝石?我无法想象没有它们的Ruby代码,因为它们是我们编写的所有东西的固有特性。只要看一看任何一段Ruby代码,肯定会有多个示例显示实际使用情况!很好的解释,非常感谢。
def safe
yield
ensure
# clean the house
end
require 'timeout'
status = Timeout::timeout(5) {
# Something that should be interrupted if it takes more than 5 seconds...
}