标签: ruby

红宝石中哈希成语的哈希?

在Ruby中创建哈希哈希允许方便的两个(或更多)维度查找.但是,插入时必须始终检查散列中是否已存在第一个索引.例如:

h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)

最好在自动创建新哈希的情况下执行以下操作:

h = Hash.new
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)

类似地,当查找第一个索引尚不存在的值时,如果返回nil而不是接收"[]"错误的未定义方法,则更为可取.

looked_up_value = h['w']['z']
Run Code Online (Sandbox Code Playgroud)

可以创建一个具有此行为的Hash包装类,但是是否存在用于完成此任务的Ruby习惯用法?

ruby idioms hash-of-hashes

34
推荐指数
1
解决办法
5217
查看次数

如何在ruby中列出当前作用域中当前可用的对象?

我是红宝石的新手,我正在玩IRB.

我发现我可以使用".methods"方法列出对象的方法,而self.methods类似于我想要的东西(类似于Python的dir(builtins)?),但我怎样才能找到方法库/模块我通过include和require加载?

irb(main):036:0* self.methods
=> ["irb_pop_binding", "inspect", "taguri", "irb_chws", "clone", "irb_pushws", "public_methods", "taguri=", "irb_pwws",
"public", "display", "irb_require", "irb_exit", "instance_variable_defined?", "irb_cb", "equal?", "freeze", "irb_context
", "irb_pop_workspace", "irb_cwb", "irb_jobs", "irb_bindings", "methods", "irb_current_working_workspace", "respond_to?"
, "irb_popb", "irb_cws", "fg", "pushws", "conf", "dup", "cwws", "instance_variables", "source", "cb", "kill", "help", "_
_id__", "method", "eql?", "irb_pwb", "id", "bindings", "send", "singleton_methods", "popb", "irb_kill", "chws", "taint",
 "irb_push_binding", "instance_variable_get", "frozen?", "irb_source", "pwws", "private", "instance_of?", "__send__", "i
rb_workspaces", "to_a", "irb_quit", "to_yaml_style", "irb_popws", "irb_change_workspace", "jobs", "type", "install_alias
_method", "irb_push_workspace", "require_gem", …
Run Code Online (Sandbox Code Playgroud)

ruby introspection irb

34
推荐指数
4
解决办法
3万
查看次数

如何增加ruby应用程序的堆栈大小.递归应用程序获取:堆栈级别太深(SystemStackError)

在stackoverflow.com上发布堆栈溢出问题,有多么有趣:-)

我正在运行一些递归的Ruby代码,我得到: "Stack level too deep (SystemStackError)"

(我很确定代码是有效的,我不是在无限的递归死亡螺旋中,但这不是重点)

有没有改变我的Ruby应用程序允许的堆栈深度/大小?

如果这是Ruby中的限制,我不太明白,因为错误说"堆栈级别",这让我觉得Ruby以某种方式计算堆栈的"级别",或者它只是意味着堆栈已满.

我试过在Vista和Ubuntu下运行这个程序,结果相同.在Ubuntu下我尝试用'ulimit -s'将堆栈大小从8192更改为16000,但这并没有改变任何东西.

编辑:感谢您的反馈.
我确实意识到使用递归函数可能不是最强大的方法.但这也不是重点.我只是想知道是否有办法增加堆栈大小..期间.正如我所提到的,我确实尝试在运行ruby脚本之前运行ulimit -s 16000 ..没有任何改进..我使用它错了吗?

Edit2:事实上我在代码的边缘情况下有一个无限递归.
当您收到"Stack level too deep"错误时,截断的ruby堆栈跟踪有点误导.
当具有涉及多个函数的递归行为时,您会得到递归数量远低于其实际值的印象.在这个示例中,可能会在超过190次调用后崩溃,但实际上大约有15000次调用

tst.rb:8:in `p': stack level too deep (SystemStackError)
        from tst.rb:8:in `bar'
        from tst.rb:12:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
         ... 190 levels...
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:22
Run Code Online (Sandbox Code Playgroud)

-Andreas

ruby recursion

34
推荐指数
4
解决办法
2万
查看次数

Python vs Groovy vs Ruby?(根据所列标准)

考虑下面列出的标准,您将使用Python,Groovy或Ruby中的哪一个?

  • 标准(10个中的重要性,10个是最重要的)
  • 丰富的API /库(例如数学,绘图,网络)(9)
  • 能够嵌入桌面(java/c ++)应用程序(8)
  • 易于部署(8)
  • 能够与DLL /共享库进行交互(7)
  • 能够生成GUI(7)
  • 社区/用户支持(6)
  • 便携性(6)
  • 数据库操作(3)
  • 语言/语义学(2)

ruby python scripting groovy

34
推荐指数
7
解决办法
3万
查看次数

Ruby符号到类

Ruby中是否有一种方法可以使用符号或字符串并将其转换为同名的类?

例如,如果我有一个类如

class Bob
  def talk
     puts "Hi, I'm bob"
  end
end
Run Code Online (Sandbox Code Playgroud)

我在代码中的其他地方的方法传递了一个符号:bob,我能以某种方式将其转换为类Bob吗?也许是这样的

b = :Bob.new
b.talk
Run Code Online (Sandbox Code Playgroud)

或者有办法做类似的事情吗?

ruby symbols class transform

34
推荐指数
4
解决办法
2万
查看次数

RSpec中mock和mock_model有什么区别

我最近遇到过不同的教程,人们使用它们mockmock_model功能.

控制器的RSpec教程中,他们使用该mock_model函数,但在RSpec文档中,只有mock函数,但没有mock_model

我试着自己运行一些测试,但我没有发现任何真正的区别,因为当我使用这两个函数中的任何一个时一切正常,所以有什么不同吗?

ruby testing rspec ruby-on-rails

34
推荐指数
2
解决办法
1万
查看次数

如何判断哪些模块已混合到一个类中?

我有一个类,它有许多模块,它们根据一些运行时标准与它混合在一起.

我希望能够获得已经混合到这个类中的模块的列表.你怎么能这样做?

UPDATE

所以,当我说类我的意思是对象,因为它是在运行时使用以下方式扩展的对象:

obj.extend(MyModule)
Run Code Online (Sandbox Code Playgroud)

obj.included_modules和obj.ancestors不存在,因此您无法从那里获取已混入的模块.

ruby

34
推荐指数
5
解决办法
1万
查看次数

34
推荐指数
2
解决办法
2万
查看次数

如何使用define_method指定方法默认参数?

define_method 可用于定义方法:

define_method(:m) do |a|
end
Run Code Online (Sandbox Code Playgroud)

这相当于以下内容:

def m(a)
end
Run Code Online (Sandbox Code Playgroud)

但是,以下使用的等效形式是什么define_method:

def m(a=false)
end
Run Code Online (Sandbox Code Playgroud)

请注意,我需要能够在m()不给出任何参数的情况下进行调用.

ruby

34
推荐指数
2
解决办法
7852
查看次数

如何使用Nokogiri解析HTML表格?

我安装了Ruby和Mechanize.在我看来,Nokogiri可以做我想做的事,但我不知道该怎么做.

那怎么样table?它只是vBulletin论坛网站HTML的一部分.我试图保留HTML结构,但删除了一些文本和标记属性.我想获得每个帖子的一些细节:标题,作者,日期,时间,回复和视图.

请注意HTML文档中的表格很少?我正在追寻一张特别的桌子tbody,<tbody id="threadbits_forum_251">.名称将始终相同(我希望).我可以在代码中使用tbodyname吗?

<table >
  <tbody>
    <tr>  <!-- table header --> </tr>
  </tbody>
  <!-- show threads -->
  <tbody id="threadbits_forum_251">
    <tr>
      <td></td>
      <td></td>
      <td>
        <div>
          <a href="showthread.php?t=230708" >Vb4 Gold Released</a>
        </div>
        <div>
          <span><a>Paul M</a></span>
        </div>
      </td>
      <td>
          06 Jan 2010 <span class="time">23:35</span><br />
          by <a href="member.php?find=lastposter&amp;t=230708">shane943</a> 
        </div>
      </td>
      <td><a href="#">24</a></td>
      <td>1,320</td>
    </tr>

  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

html ruby html-table mechanize nokogiri

34
推荐指数
1
解决办法
3万
查看次数