我们能否像在java中那样在Ruby中公开接口(interface),并强制Ruby模块或类实现接口(interface)定义的方法。一种方法是使用继承和method_missing来实现相同的目的,但是还有其他更合适的方法吗? 最佳答案 Ruby与任何其他语言一样具有接口(interface)。请注意,您必须注意不要将接口(interface)的概念与interface的概念混淆,接口(interface)是一个单元的职责、保证和协议(protocol)的抽象规范。这是Java、C#和VB.NET编程语言中的关键字。在Ruby中,
一般来说,我如何才能获得对名称在字符串中的对象的引用?更具体地说,我有一个参数名称列表(成员变量-动态构建,所以我不能直接引用它们)。每个参数都是一个对象,也有一个from_s方法。我想做类似下面的事情(这当然行不通......):define_method(:from_s)do|arg|@ordered_parameter_names.eachdo|param|instance_eval"field_ref=@#{param}"field_ref.from_s(param)endend 最佳答案 实现这一点的最惯用的方法是:som
是否可以在ruby中创建/使用基于变量名值的正则表达式模式?例如,我们都知道我们可以使用Ruby字符串执行以下操作:str="mystring"str2="Thisis#{str}"#=>"Thisismystring"我想用正则表达式做同样的事情:var="Value"str="atestValue"str.gsub(/#{var}/,'foo')#=>"atestfoo"显然,这并不像列出的那样工作,我只是把它放在那里作为一个例子来展示我想做什么。我需要根据变量内容的值进行正则表达式匹配。 最佳答案 您认为行不通的代码:va
我正在使用Rails4.1中的枚举来跟踪Wine的颜色。Wine.rbclassWine在我看来,我生成了一个选择,因此用户可以选择具有特定颜色的Winef.input:color,:as=>:select,:collection=>Wine.colors这会生成以下HTML:redwhitesparkling但是,在提交表单时,我收到一个参数错误,指出'1'不是有效的颜色。我意识到这是因为color必须等于1而不是"1"。有没有办法强制Rails将颜色解释为整数而不是字符串? 最佳答案 好吧,显然,您不应该发送要保存的枚举的整数值
有没有什么方法可以在Ruby模块中创建一个行为类似于类变量的变量?我的意思是,无需初始化模块实例即可访问它,但它可以更改(与模块中的常量不同)。 最佳答案 Ruby原生支持模块中的类变量,因此您可以直接使用类变量,而不是一些代理或伪类变量:moduleSite@@name="StackOverflow"defself.setName(value)@@name=valueenddefself.name@@nameendendSite.name#=>"StackOverflow"Site.setName("Test")Site.name
还有什么比下面更地道的吗?foo.class==String 最佳答案 我认为您正在寻找instance_of?。is_a?和kind_of?将为派生类的实例返回true。classX 关于ruby-检查变量是否是Ruby中的字符串,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7749416/
给定一个数组、单个元素或nil,得到一个数组-后两者分别是单个元素数组和空数组。我错误地认为Ruby会这样工作:[1,2,3].to_a#=[1,2,3]#Alreadyanarray,sonochange1.to_a#=[1]#Createsanarrayandaddselementnil.to_a#=[]#Createsemptyarray但你真正得到的是:[1,2,3].to_a#=[1,2,3]#Hooray1.to_a#=NoMethodError#Donotwantnil.to_a#=[]#Hooray所以要解决这个问题,我要么需要使用另一种方法,要么我可以通过修改我打算使
我目前正在尝试将一个字符串转换为多个变量。示例字符串:ryan_string="RyanOnRails:Thisisatest"我已将其与此正则表达式匹配,分为3组:ryan_group=ryan_string.scan(/(^.*)(:)(.*)/i)现在要访问每个组,我必须执行如下操作:ryan_group[0][0](firstgroup)RyanOnRailsryan_group[0][1](secondgroup):ryan_group[0][2](thirdgroup)Thisisatest这看起来很荒谬,感觉我做错了什么。我希望能够做这样的事情:g1,g2,g3=ryan
为了检查@some_var是什么,我正在做一个if@some_var.class.to_s=='Hash'我确信有一种更优雅的方法来检查@some_var是Hash还是Array。 最佳答案 你可以这样做:@some_var.class==Hash或者类似的东西:@some_var.is_a?(Hash)值得注意的是“is_a?”如果类位于对象祖先树中的任何位置,则方法为真。例如:@some_var.is_a?(Object)#=>true如果@some_var是散列或其他源自Object的类的实例,则上述内容为真。所以,如果你想严
classMyClassdefmymethodMYCONSTANT="blah"endend给我错误:SyntaxError:dynamicconstantassignmenterror为什么这被认为是一个动态常数?我只是为其分配一个字符串。 最佳答案 您的问题是,每次运行该方法时,您都会为常量分配一个新值。这是不允许的,因为它使常量变得非常量;即使字符串的内容是相同的(至少就目前而言),实际的字符串对象本身在每次调用该方法时都是不同的。例如:deffoop"bar".object_idendfoo#=>15779172foo#=>