主页
论坛
新帖
最新消息
新帖
最新动态
制作互助群
登录
注册
Toggle sidebar
Toggle sidebar
菜单
安装应用
安装
回复主题
【进站必读】宝可饭堂社区全局规定v1.10
关于坚决维护同人创作社群秩序与共识的公告
论坛
独立开发
进阶教程
【ESS】11 Blocks 和 Procs
禁用JavaScript。为了获得更好的体验,请在运行之前启用浏览器中的JavaScript。
您正在使用一款已经过时的浏览器!部分功能不能正常使用。
请尝试升级或使用
其他浏览器
。
信息
<blockquote data-quote="小语咒?" data-source="post: 2326" data-attributes="member: 123"><p><h3>11: Blocks 和 Procs</h3><p>代码块和 Procs 提供了灵活且强大的方法来封装和传递代码。</p><p></p><h3>Blocks</h3><p>一个代码块是一个匿名代码段,可以与方法一起使用。你可以在方法定义中使用 yield 关键字来执行传递给方法的块。</p><p></p><p>[code=ruby]</p><p>def greet</p><p> yield</p><p>end</p><p></p><p>greet { print "Hello, world!" } # 输出 "Hello, world!"</p><p>[/code]</p><p></p><p>你也可以传递带参数的块:</p><p></p><p>[code=ruby]</p><p>def greet</p><p> yield("Ruby")</p><p>end</p><p></p><p>greet { |name| print "Hello, #{name}!" } # 输出 "Hello, Ruby!"</p><p>[/code]</p><p></p><h3>使用 yield 的优势</h3><p>yield 的优势在于它允许你在方法中执行任意代码,而不需要显式地将其作为参数传递。这使得方法更加灵活和动态。</p><p></p><p>[code=ruby]</p><p>def calculate</p><p> result = yield(5, 10)</p><p> print "Result: #{result}"</p><p>end</p><p></p><p>calculate { |a, b| a + b } # 输出 "Result: 15"</p><p>calculate { |a, b| a * b } # 输出 "Result: 50"</p><p>[/code]</p><p></p><h3>检查块是否存在</h3><p>使用 block_given? 方法可以检查块是否存在,以避免在没有块的情况下调用 yield 引发错误。</p><p></p><p>[code=ruby]</p><p>def greet</p><p> if block_given?</p><p> yield</p><p> else</p><p> print "Hello!"</p><p> end</p><p>end</p><p></p><p>greet { print "Hi there!" } # 输出 "Hi there!"</p><p>greet # 输出 "Hello!"</p><p>[/code]</p><p></p><h3>Procs</h3><p>Proc 对象是一个封装了代码块的对象,可以在不同的上下文中多次调用。你可以使用 Proc.new 或 proc 方法创建一个 Proc 对象。</p><p></p><p>[code=ruby]</p><p>my_proc = Proc.new { print "Hello from Proc!" }</p><p>my_proc.call # 输出 "Hello from Proc!"</p><p>[/code]</p><p></p><h3>带参数的 Procs</h3><p>你可以创建带参数的 Proc 对象,并在调用时传递参数。</p><p></p><p>[code=ruby]</p><p>my_proc = Proc.new { |name| print "Hello, #{name}!" }</p><p>my_proc.call("Ruby") # 输出 "Hello, Ruby!"</p><p>[/code]</p><p></p><h3>将块转换为 Proc</h3><p>你可以使用 & 操作符将一个块转换为 Proc,并将其传递给另一个方法。</p><p></p><p>[code=ruby]</p><p>def greet(&block)</p><p> block.call("Ruby")</p><p>end</p><p></p><p>greet { |name| print "Hello, #{name}!" } # 输出 "Hello, Ruby!"</p><p>[/code]</p><p></p><h3>Lambda</h3><p>lambda 是一种特殊类型的 Proc,它的行为与普通的 Proc 略有不同。使用 lambda 关键字创建。</p><p></p><p>[code=ruby]</p><p>my_lambda = lambda { print "Hello from Lambda!" }</p><p>my_lambda.call # 输出 "Hello from Lambda!"</p><p>[/code]</p><p></p><h3>Lambda 和 Proc 的区别</h3> <ol> <li data-xf-list-type="ol">参数检查:lambda 会严格检查参数个数,而 Proc 则不会。</li> <li data-xf-list-type="ol">返回行为:lambda 返回时仅从当前块返回,而 Proc 会返回整个方法。</li> </ol><p>[code=ruby]</p><p>my_proc = Proc.new { return "From Proc" }</p><p>def call_proc</p><p> result = my_proc.call</p><p> print "Result: #{result}" # 不会执行</p><p>end</p><p># call_proc # 直接从方法中返回</p><p></p><p>my_lambda = lambda { return "From Lambda" }</p><p>def call_lambda</p><p> result = my_lambda.call</p><p> print "Result: #{result}" # 输出 "Result: From Lambda"</p><p>end</p><p>call_lambda</p><p>[/code]</p></blockquote><p></p>
[QUOTE="小语咒?, post: 2326, member: 123"] [HEADING=2]11: Blocks 和 Procs[/HEADING] 代码块和 Procs 提供了灵活且强大的方法来封装和传递代码。 [HEADING=2]Blocks[/HEADING] 一个代码块是一个匿名代码段,可以与方法一起使用。你可以在方法定义中使用 yield 关键字来执行传递给方法的块。 [code=ruby] def greet yield end greet { print "Hello, world!" } # 输出 "Hello, world!" [/code] 你也可以传递带参数的块: [code=ruby] def greet yield("Ruby") end greet { |name| print "Hello, #{name}!" } # 输出 "Hello, Ruby!" [/code] [HEADING=2]使用 yield 的优势[/HEADING] yield 的优势在于它允许你在方法中执行任意代码,而不需要显式地将其作为参数传递。这使得方法更加灵活和动态。 [code=ruby] def calculate result = yield(5, 10) print "Result: #{result}" end calculate { |a, b| a + b } # 输出 "Result: 15" calculate { |a, b| a * b } # 输出 "Result: 50" [/code] [HEADING=2]检查块是否存在[/HEADING] 使用 block_given? 方法可以检查块是否存在,以避免在没有块的情况下调用 yield 引发错误。 [code=ruby] def greet if block_given? yield else print "Hello!" end end greet { print "Hi there!" } # 输出 "Hi there!" greet # 输出 "Hello!" [/code] [HEADING=2]Procs[/HEADING] Proc 对象是一个封装了代码块的对象,可以在不同的上下文中多次调用。你可以使用 Proc.new 或 proc 方法创建一个 Proc 对象。 [code=ruby] my_proc = Proc.new { print "Hello from Proc!" } my_proc.call # 输出 "Hello from Proc!" [/code] [HEADING=2]带参数的 Procs[/HEADING] 你可以创建带参数的 Proc 对象,并在调用时传递参数。 [code=ruby] my_proc = Proc.new { |name| print "Hello, #{name}!" } my_proc.call("Ruby") # 输出 "Hello, Ruby!" [/code] [HEADING=2]将块转换为 Proc[/HEADING] 你可以使用 & 操作符将一个块转换为 Proc,并将其传递给另一个方法。 [code=ruby] def greet(&block) block.call("Ruby") end greet { |name| print "Hello, #{name}!" } # 输出 "Hello, Ruby!" [/code] [HEADING=2]Lambda[/HEADING] lambda 是一种特殊类型的 Proc,它的行为与普通的 Proc 略有不同。使用 lambda 关键字创建。 [code=ruby] my_lambda = lambda { print "Hello from Lambda!" } my_lambda.call # 输出 "Hello from Lambda!" [/code] [HEADING=2]Lambda 和 Proc 的区别[/HEADING] [LIST=1] [*]参数检查:lambda 会严格检查参数个数,而 Proc 则不会。 [*]返回行为:lambda 返回时仅从当前块返回,而 Proc 会返回整个方法。 [/LIST] [code=ruby] my_proc = Proc.new { return "From Proc" } def call_proc result = my_proc.call print "Result: #{result}" # 不会执行 end # call_proc # 直接从方法中返回 my_lambda = lambda { return "From Lambda" } def call_lambda result = my_lambda.call print "Result: #{result}" # 输出 "Result: From Lambda" end call_lambda [/code] [/QUOTE]
验证
阿尔宙斯这只宝可梦在全国图鉴中的编号是?(3位纯数字)
回复帖子
最新帖子
全
我想切换视角讲述故事
最新更新:全民制作人
星期三,21:43
开发问题
Z
将GBA打包成APK
最新更新:zheyeyeye
星期三,21:27
GBA教程
Z
【进站必读】宝可饭堂社区全局规定v1.10
最新更新:z1652646304
星期三,20:25
公告规定
雨
pokeemerald怎么改箱子数
最新更新:雨落天晴
星期二,10:16
开发问题
[讨论]什么契机导致你想做游戏的
最新更新:A原翼
星期一,00:12
其他相关讨论
论坛统计
主题
559
消息
2,422
成员
3,879
最新成员
stonezz
联系我们
QQ
2201858342
邮箱
pokefans@qq.com
论坛
独立开发
进阶教程
【ESS】11 Blocks 和 Procs
顶部