只有核心Ruby方法可以使用object.functionName语法调用吗?是否可以创建我自己的可以以点语法方式调用的方法?
对于这种方法:
def namechanger (name)
nametochange = name
puts "This is the name to change: #{nametochange}"
end
第一个在下面工作,第二个没有。
namechanger("Steve")
"Steve".namechanger
我在"Steve".namechanger
错误是:
rb:21:in `<main>': private method `namechanger' called for "Steve":String (NoMethodError)
答案 0 :(得分:3)
是的,您可以向String类添加方法以实现所需的效果;变量“self
”指的是接收方法调用的对象。
class String
def namechanger
"This is the name to change: #{self}"
end
end
"Steve".namechanger # => This is the name to change: Steve
这种做法称为monkey patching,应谨慎使用。
答案 1 :(得分:1)
而不是monkeypatching,你可以总是子类化,因此:
例如:
class PersonName < String
def namechanger
puts "This is the name to change: #{self}"
end
end
s = PersonName.new( "Iain" )
s.namechanger
This is the name to change: Iain
=> nil
答案 2 :(得分:0)
您在第一种形式中所拥有的是一个采用参数的方法,该参数与不采用任何参数的方法非常不同。让我来说明一下
ruby
namechanger("Steve")
查找名为namechanger
的方法并将字符串参数传递给它。直接前进。它在一些未知的上下文中查找,可能是另一个方法的本地,它将在接收该方法的对象上查找它。
ruby
"Steve".namechanger
是一种不在String
上存在任何参数的方法。通常,这些方法使用隐式self
参数来操作某些数据。
答案 3 :(得分:0)
如果您希望能够致电"Steve".namechanger
,则必须namechanger
这样的String
类方法{/ 1}}:
class String
def namechanger
puts "This is the name to change: #{self}"
end
end
这通常被称为“猴子修补”,在进入相关的考虑和讨论之前,您可能希望稍微提高一般的Ruby熟练程度。
答案 4 :(得分:0)
你可以做到
class String
def namechanger
puts "This is the name to change: #{self}"
end
end
不同之处在于,您的第一个示例是一个(基本上)全局定义的方法,它接受一个字符串并对其进行操作。然而,上面的代码定义了一个名为&#34; namechanger&#34;的方法。它不带参数,直接在String类上定义它。因此,应用程序中的任何和所有字符串都将具有此方法。
但正如pst所说,在你对Ruby更加熟悉之前,你可能不应该深入研究这种编程风格,这样你就可以更容易地看到像这样做monkeypatching的好处和缺点。其中一个考虑因素是你可能有很多不能代表名字的字符串,而且这些字符串有一个名为namechanger的方法并没有多大意义。
那就是说,如果你的目标只是让Ruby有点乐趣,看看你能做些什么,那么就去做吧,但要记住在更长寿命的项目中要更加小心。