我正在尝试理解以下Ruby代码。看起来attrs是一个散列,它作为参数传递,默认值为空散列。然后attrs.each迭代散列中的键值对(|k,v|)。在本次迭代中对键值对的元素调用self.send会达到什么效果?definitialize(attrs={},*args)super(*args)attrs.eachdo|k,v|self.send"#{k}=",vendend 最佳答案 send在第一个参数中调用该方法,并将其余参数作为参数传递。在这种情况下,我假设attrs中的内容是一个属性列表。假设它是这样的:{:name=>"
我看到这样的代码:classPersondefinitialize(name)@name=nameendend我知道这让我可以做person=Person.new之类的事情,并像其他方法一样在我的类中的其他地方使用@name。然后,我看到了如下代码:classPersonattr_accessor:nameend...person=Person.newperson.name="David"我只是对这两种方法网格不知所措。definitialize(name)的特殊用途是什么?我想attr_accessor允许我读写。这意味着它们是两种不同的方法。是的?想要澄清definitialize
在RubyonRails中有没有更好的方法来实现这一点?我正在搜索11个字段,所有字段也是必需的,如果找不到,请对其进行初始化。将有更多必填字段添加到其中。这个查询非常适合我,但它看起来并不是执行此操作的最佳方式。find_or_initialize_by_make_and_country_and_engine_and_power_and_body_and_doors_and_fuel_and_cylinders_and_transmission_and_gears_and_wheels(model,country,engine,power,body,doors,fuel,cylind
我正在尝试在Ubuntu10.04上运行Rails3beta4和Ruby1.9.2rc。它最初有效,但在完成我的第一个bundleinstall/package之后,我现在在所有Rails项目中都遇到以下错误。即使是基本的“railsnewtestproject”后跟一个rake也会显示错误消息。简而言之,我很难过。非常感谢任何有关可能导致此问题的帮助。我唯一注意到的事情——可能相关也可能不相关——是~/.bundle文件中的目录是ruby/1.9.1。我的机器上没有安装1.9.1-只有1.9.2rc。ruby-v带回1.9.2(in/home/john/Websites/sand
尝试在initialize中使用define_method但得到undefined_methoddefine_method。我做错了什么?classCdefinitialize(n)define_method("#{n}"){puts"somemethod#{n}"}endendC.new("abc")#=>NoMethodError:undefinedmethod`define_method'for# 最佳答案 我怀疑您正在寻找define_singleton_method:define_singleton_method(symb
如何调用父类的构造函数?moduleCattr_accessor:c,:ccdefinitializationc,cc@c,@cc=c,ccendendclassBattr_accessor:b,:bbdefinitializationb,bb@b,@bb=b,bbendendclassA谢谢。 最佳答案 Ruby没有构造函数,因此显然不可能调用它们,无论是父类还是其他。然而,Ruby确实有方法,并且为了调用与当前正在执行的方法同名的父方法,您可以使用super关键字。[注意:不带参数的super是传递与当前正在执行的方法相同的参数
尝试运行rakecucumber:ok并收到此错误:/Users/dev/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.4/lib/rack/backports/uri/common_192。rb:53:警告:常量WFKV_已经初始化然后:命令失败,状态为(1):[/Users/dev/.rbenv/versions/1.9.2-p290/bin...]我是Rails的新手,Google没有针对此错误提供任何信息。编辑:我试过添加bundleexec,但没有任何区别。这是我用--trace得到的结果:/User
如果我有这个类:classAattr_accessor:b,:c,:dend和这段代码:a=A.newh={"b"=>10,"c"=>20,"d"=>30}是否可以直接从散列初始化对象,而不需要遍历每一对并调用instance_variable_set?像这样的东西:a=A.new(h)这应该会导致每个实例变量被初始化为在散列中具有相同名称的变量。 最佳答案 你可以在你的类上定义一个初始化函数:classAattr_accessor:b,:c,:ddefinitialize(h)h.each{|k,v|public_send("#{
我正在尝试创建一个类,它有一个接受单个参数的构造函数。当我创建对象的新实例时,它返回一个指针。classAdderdefinitialize(my_num)@my_num=my_numendendy=Adder.new(12)putsy我做错了什么?谢谢 最佳答案 当您使用new方法时,您会获得新创建对象的“引用”。puts内核方法返回有关此对象的一些内部ruby信息。如果你想获得关于状态你的对象的任何信息,你可以使用getter方法:classAdderdefinitialize(my_num)@my_num=my_numen
我想要的是:obj=Foo.new(0)#=>nilorfalse这行不通:classFoodefinitialize(val)returnnilifval==0endend我知道在C/C++/Java/C#中,我们不能在构造函数中返回值。但我想知道在Ruby中是否可行。 最佳答案 InRuby,what'stherelationshipbetween'new'and'initialize'?new通常调用initialize。new的默认实现类似于:classClassdefnew(*args,&block)obj=allocat