让我们来看一个普通的ruby类:classPersonattr_accessor:namedefinitializename@name=nameendendbob=Person.new("bob")我的问题是初始化的性质。事情是这样的,new显然是一个类方法,但在我看来initialize是一个实例方法(不是类),它在类方法创建的实例上调用new被调用。我有这个权利吗?或者有人可以阐明一些新的观点吗?我做了一些谷歌搜索,但找不到任何清晰度。 最佳答案 当一个新对象被初始化时(也就是说,当你在一个类上调用new时)有效调用的是这个
哪个更好:x=='abc'||x=='def'||x=='ghi'%w(abcdefghi).include?xx=~/abc|def|ghi/? 最佳答案 哪个更好?这个问题不容易回答,因为他们做的事情不尽相同。x=='abc'||x=='def'||x=='ghi'%w(abcdefghi).include?x比较x与固定字符串是否相等。x必须是这些值之一。在这两者之间,我倾向于选择第二个,因为它更容易维护。想象一下,如果您必须与20、50或100个字符串进行比较会是什么样子。第三个测试:x~=/abc|def|ghi/匹配子串
我知道Forwardable#def_delegate如何与对象的方法一起工作,但是是否有类似的方法将方法名称转发到哈希键。喜欢:hash={some_value:42,other_value:31415}def_delegate:hash,:some_value,:other_value调用object.some_value应该返回42PS:def和classeval是一种方法,但是有更好的方法吗? 最佳答案 这对OpenStruct来说是件好事,它基本上将哈希包装在一个对象中。2.2.1:001>require'ostruct'
我正在同时学习ruby和ROR,并且在别人的代码中注意到一件事。有时我会看到以这两种明显略有不同的方式定义方法:classSomeClass这有什么区别吗?我的意思是,在方法定义中使用self会影响方法的工作方式吗?欢迎任何启发。 最佳答案 defself.method_name将定义一个类方法而不是实例方法-class关于该主题的一篇好文章是thispost来自耶胡达·卡茨例如:classFoodefmethod_1"calledfrominstance"enddefself.method_2"calledfromclass"
我有一个使用Forwardable中的def_delegators方法的类模块。我还没有找到获取Yardoc的方法为其输出文档。我试过使用macro但它不会为这些特定方法输出任何内容(文件中的其他一切都很好,并且没有错误),而且我有几个不同长度的def_delegators。例如classAextendForwardable#othercode…#@!macro#@seeArray#$1#@seeArray#$2#@seeArray#$3def_delegators:@xs,:size,:是否有gem或方法可以避免尝试编写Yard扩展? 最佳答案
我正在阅读Pickaxe1.9,作者是这样使用lambda的:bo=lambda{|param|puts"Youcalledmewith#{param}"}bo.call99=>'Youcalledmewith99'bo.call"cat"=>'Youcalledmewithcat'我的问题是:这与仅定义一个执行相同操作的方法相比有何更好/更差/不同之处?像这样:defbo(param)puts"Youcalledmewith#{param}"endbo("hello")=>'Youcalledmewithhello'对我来说,lambda语法似乎更令人困惑,更像意大利面条。
在此Haskell-likecomprehensionsimplementationinRuby有一些我在Ruby中从未见过的代码:classArraydef+@#implementationenddef-@#implementationendenddef+@和def-@是什么意思?在哪里可以找到关于它们的(半)官方信息? 最佳答案 它们是一元的+和-方法。当您编写-object或+object时会调用它们。例如,语法+x被替换为x.+@。考虑一下:classFoodef+(other_foo)puts'binary+'enddef
在以下Ruby代码中@代表什么:moduleTestRocketextendModule.new{attr_accessor:out}def_test(a,b);send((callrescue())?a:b);enddef+@;_show_test:_pass,:_failenddef-@;_show_test:_fail,:_passenddef~@;_show_pend;enddef!@;_show_desc;enddef_show(r);(TestRocket.out||$>)然后这用作:+->{Die.new(2)}-->{raise}+->{2+2==4}@如何在函数名中变
我知道这是什么意思:deff(*args)...end但这意味着什么,为什么要使用它?它也可以与命名参数一起出现吗?deff(*)...end 最佳答案 deff(*)与deff(*args)具有相同的效果,只是它没有命名globbed参数数组。如果您希望函数接受任意数量的参数但实际上不需要在函数内引用它们,则可以使用它——例如,如果您重写一个方法但调用super而没有传递一个显式参数列表,这会导致将原始参数传递给super。您也可以编写deff(a,b,*)。 关于ruby-裸星号作为
我正在为Test::Unit苦苦挣扎。当我想到单元测试时,我会想到每个文件一个简单的测试。但在Ruby的框架中,我必须改写:classMyTest但是每次调用test_*方法时都会运行设置和拆卸。这正是我不想要的。相反,我想要一个只为整个类(class)运行一次的设置方法。但是我似乎无法在不破坏TestCase的初始化的情况下编写自己的initialize()。这可能吗?还是我让这件事变得无可救药地复杂了? 最佳答案 如HalFulton的书“TheRubyWay”中所述。他覆盖了Test::Unit的self.suite方法,该方