ruby块问题循环变量

时间:2012-05-19 05:58:07

标签: ruby block ruby-1.9.3

comics = load_comics( '/comics.txt' )

Popup.make do
  h1 "Comics on the Web"
  list do
    comics.each do |name, url|
      link name, url
    end
  end
end

我是红宝石的新手。这是来自ruby网站的一段代码。

我无法在菜单中找到'link'和'list'关键字。 有人可以解释一下这两个关键字,这两个关键字的定义在哪里。

我也对他们如何读取变量名称和url感到困惑,他们是通过同一行的空间读取它还是什么? 所以,如果我有 漫画1 link_of_comics_site_1 漫画2 link_of_comics_site_2 漫画3 link_of_comics_site_3

所以对于第一次迭代,name = Comics1,url = link_of_comics_site_1

感谢。

2 个答案:

答案 0 :(得分:2)

那不仅仅是Ruby。这是使用ruby附加方法生成HTML的网页模板。

但是可能,调用load_comics的结果是Hash,其中键是名称,值是URL。你可以自己制作一个:

my_comics_hash = { "name1" => "url1", "name2" => "url2" }

然后你可以用同样的方式迭代:

my_comics_hash.each do |name, url|
  puts "Name #{name} goes with URL #{url}"
end

在你的代码中,它在弹出窗口中构建一个HTML列表,但它的想法是一样的。 each方法对集合进行迭代 - 在本例中为哈希 - 并在该集合中的每个项目上运行一些代码 - 在这种情况下,每个键/值对。当您致电each时,您会在do ... end内传递一段代码;这是在每个项目上运行的代码。当前项目被传递给代码块,代码块声明一个变量,将其保存在单词do之后的管道内。由于我们迭代键/值对,我们可以声明两个变量,键在第一个中,而值在第二个中。

答案 1 :(得分:1)

在ruby函数中,括号是可选的,而“;”语句结束也是可选的。 EJ

link "click here" , "http://myweb.com" 

相当于:

link("click here", "http://myweb.com");

但是如果你在一行中有多个语句“;”是必须的,ej

  link("click here1", "http://myweb.com"); link("click here2", "http://myweb.com");

在您的代码中,它可以用

编写
 link(name, url)

或只是

 link(name, url);

 link name, url

但强烈建议在功能参数周围添加括号以提高可读性,除非您有其他原因。 “;”在红宝石世界中并不常见。