Dot语法与param传递语法

时间:2012-01-12 21:54:41

标签: ruby syntax

只有核心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)

5 个答案:

答案 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,你可以总是子类化,因此:

  1. 准确地说明您认为对象真正的内容。
  2. 获取String
  3. 的所有方法

    例如:

    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有点乐趣,看看你能做些什么,那么就去做吧,但要记住在更长寿命的项目中要更加小心。