【发布时间】:2018-09-17 13:15:05
【问题描述】:
这是我基于 TeamTreeHouse 上的 ruby 轨道上的 Ruby 块的视频课程创建的代码,这里是代码及其输出..
我的代码:
def get_name(prompt, &block)
print prompt + ": "
name = gets.chomp
print "age: "
age = gets.chomp
#block.call(nam,ag)
yield name, age
yield age
name
end
my_name = get_name("enter your name") do |name, age|
puts "That's a cool name, #{name}, #{age}"
end
my_name2 = get_name("enter your age") do |age|
puts "That's a cool age, #{age}"
end
puts "my_name: #{my_name} #{my_name2}"
我的输出:
treehouse:~/workspace$ ruby calling_blocks.rb
enter your name: ahmed
age: 25
That's a cool name, ahmed, 25
That's a cool name, 25,
enter your age: 25
age: 25
That's a cool age, 25
That's a cool age, 25
my_name: ahmed 25
该代码的问题在于,在跟踪它时,我发现输出无关紧要,这就是我认为必须发生的事情:
1- 第一个 get_name 块发送一个带有问题“输入您的姓名”的提示,然后方法 get_name 首先打印短语“输入您的姓名”作为参数称为提示,然后该方法将名称作为输入并以年龄为输入
2- 第一个yield "yield name,age" 向第一个get_name 块发回通过|name,age| 接收到的名称和年龄,然后它们都显示在
puts "That's a cool name, #{name}, #{age}"
这样
That's a cool name, ahmed, 25
3- 第二个yield "yield age" 这次只向第一个get_name 块发送年龄,它是通过|name,age| 在块中接收的,这一次因为我们只向块发送回一个参数,而block有两个参数,这次block上的name参数接收到来自“yield name”的age参数,而block上的age参数什么也没收到,所以在block中,#{name}只显示值而#{age} 什么都不显示
puts "That's a cool name, #{name}, #{age}"
这样
That's a cool name, 25,
我的追踪是真的吗? 因为如果这是真的,为什么在第二个 get_name 块中,即
my_name2 = get_name("enter your age") do |age|
puts "That's a cool age, #{age}"
end
输出是:
That's a cool age, 25
That's a cool age, 25
代替:
That's a cool age, ahmed
That's a cool age, 25
另一个问题: 在
puts "my_name: #{my_name} #{my_name2}"
为什么#{my_name2}的值=25,而不是=ahmed,知道get_name方法的最后一行,我返回的是name,而不是age?
这个问题的简短版本: 请帮我追踪我的代码,告诉我到底发生了什么?
【问题讨论】:
标签: ruby-on-rails ruby methods yield trace