在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习惯用法?
我是红宝石的新手,我正在玩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) 在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
考虑下面列出的标准,您将使用Python,Groovy或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)
或者有办法做类似的事情吗?
我最近遇到过不同的教程,人们使用它们mock和mock_model功能.
在控制器的RSpec教程中,他们使用该mock_model函数,但在RSpec的文档中,只有mock函数,但没有mock_model
我试着自己运行一些测试,但我没有发现任何真正的区别,因为当我使用这两个函数中的任何一个时一切正常,所以有什么不同吗?
我有一个类,它有许多模块,它们根据一些运行时标准与它混合在一起.
我希望能够获得已经混合到这个类中的模块的列表.你怎么能这样做?
UPDATE
所以,当我说类我的意思是对象,因为它是在运行时使用以下方式扩展的对象:
obj.extend(MyModule)
Run Code Online (Sandbox Code Playgroud)
obj.included_modules和obj.ancestors不存在,因此您无法从那里获取已混入的模块.
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和Mechanize.在我看来,Nokogiri可以做我想做的事,但我不知道该怎么做.
那怎么样table?它只是vBulletin论坛网站HTML的一部分.我试图保留HTML结构,但删除了一些文本和标记属性.我想获得每个帖子的一些细节:标题,作者,日期,时间,回复和视图.
请注意HTML文档中的表格很少?我正在追寻一张特别的桌子tbody,<tbody id="threadbits_forum_251">.名称将始终相同(我希望).我可以在代码中使用tbody和name吗?
<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&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)