如何在Ruby中复制此PHP代码?

时间:2011-10-14 19:33:16

标签: php ruby lambda closures

我正在将一些项目移到Rails,我想复制这个PHP代码:

http://www.php.net/manual/en/functions.anonymous.php#106046

到目前为止,我有这个:

def html (tag, id = "", hclass = "")
  hopen = "<#{tag}"
  hclose = "</#{tag}>"
  unless id == ""
    hopen += " id=\"#{id}\""
  end

  unless hclass == ""
    hopen += " class=\"#{hclass}\""
  end

  hopen += ">"

  return lambda  { |data| print hopen,data,hclose}
end

我需要创建变量变量,如下所示: 的 PHP

$layout = array('container','header','pmain','lsidebar','rsidebar','footer');

foreach ($layout as $element)
   $$element = html ("div", $element);

这是我的 RUBY 原型

layout = [:body, :header, :sidebar, :footer]

##I know this isn't right, but how do I create the dynamic functions like PHP???
layout.each {|x| instance_variable_set "@#{x}", 0 }

另外,我需要调用函数,无论如何都没有调用方法吗?如果我必须嵌入电话,那将会很混乱。

h1 = html(:h1)
mainx =  html(:div )
puts mainx.class
puts mainx.call(h1.call("Blog!")) 

2 个答案:

答案 0 :(得分:4)

你在这里做了很多,但这里有一些过渡的帮助:

$layout = array('container','header','pmain','lsidebar','rsidebar','footer');

foreach ($layout as $element)
  $$element = html ("div", $element);

据我所知,这是一个数组转换,所以等价如下:

layout = [ @container, @header, @pmain, @lsidebar, @rsidebar, @footer]

layout.collect! do |element|
  # Using the built-in content_tag method instead of
  # the custom reimplementation with curried parameters.
  content_tag("div", element)
end

没有Ruby方法来取消引用变量,因为Ruby中的变量以完全不同的方式运行。实例变量在对象的上下文中持久存在,而变量仅在给定范围内持久存在。您可以按名称获取和设置任意实例变量,但通常不能对局部变量执行相同操作。除了$$var之外,Ruby中没有eval { var }等价物,由于它可能会对任意代码进行评估,因此它实际上是不受欢迎的。

但是,我真的很难过为什么你需要这样做。模板应该是一种解决这个低级别事物的方法。

如果你是Ruby的新手,最好的办法是阅读有关String和Array的文档,因为它们都充满了有用的方法。 Array还包括Enumerable模块,它可以添加更多。

答案 1 :(得分:2)

如果您正在使用rails项目,那么有很多助手可以帮助您构建html

实际上,有一个名为** content_tag **的辅助方法可以执行相同的操作。您可以在此处查看文档:http://apidock.com/rails/v3.1.0/ActionView/Helpers/TagHelper/content_tag

样本用法

content_tag(:tag_i_want, :id => 'my_id', :class => 'my_class') do
   "the content I want inside the tag"
end

输出:

<tag_i_want id="my_id" class="my_class">the content I want inside the tag</tag_i_want>

第二个问题有点奇怪。解释更多你想做什么。 ¿创建@ body,@ head,@ sidebar和@footer变量?¿全部?