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...
}