【问题标题】:How can I duplicate this PHP code in Ruby?如何在 Ruby 中复制此 PHP 代码?
【发布时间】:2011-12-08 00:42:39
【问题描述】:

我正在将一些项目转移到 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!")) 

【问题讨论】:

    标签: php ruby lambda closures


    【解决方案1】:

    如果你在 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、@header、@sidebar 和@footer 变量?¿就这些了吗?

    【讨论】:

    • 谢谢,我想我试图重新发明轮子。我想要一个非常紧凑的符号来做到这一点。仍然好奇如何在 Ruby 中做这些事情:)。
    • @Len: content_tag 有很多选择,但您不必全部提供。它可以像这样紧凑:content_tag :h1, "Blog!"。但是,您的代码非常接近,所以很明显您正在理解的道路上。这是一篇可能有帮助的(旧)文章:igvita.com/2007/03/15/block-helpers-and-dry-views-in-rails
    • 是的,我想使用一个数组来创建那些作为函数指针的变量。另外,我想使用这些文字作为函数的参数。我将根据我在这里学到的知识做更多的研究......谢谢!
    【解决方案2】:

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

    $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 中的变量的行为方式完全不同。实例变量在对象的上下文中持续存在,而变量仅在给定范围内持续存在。您可以按名称获取和设置任意实例变量,但通常不能对局部变量执行相同操作。除了 eval { var } 之外,Ruby 中没有 $$var 等价物,因为它如何评估潜在的任意代码而令人不悦。

    不过,我真的不知道为什么你需要这样做。模板应该是一种解决低级别问题的方法。

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

    【讨论】:

    • 我是 Ruby 新手。你的回答真的解释了很多!我知道 eval 但我避免像 PHP 的瘟疫一样。撇开 HTML 问题不谈,是否可以采用符号数组或其他任何东西,并使用该数组来创建命名的“函数指针”并将元素用作函数中的参数。就我所见,这可能是不可能的。
    • Ruby 和 JavaScript 一样,一般没有函数指针,而是对函数的引用,这是另一回事。 Ruby 中的最佳实践是创建一个在调用时执行所需操作的 Proc,或者保留要调用的方法的符号。例如:container_html = lambda { ... }container_method = :container 后跟 container_html = some_object.send(container_method)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2018-12-22
    • 2015-08-19
    相关资源
    最近更新 更多