Ruby 点语法与参数传递语法

Ruby 点语法与参数传递语法,ruby,syntax,Ruby,Syntax,是否只有核心Ruby方法可以使用object.functionName语法调用?是否可以自己创建可以点语法方式调用的方法 对于此方法: def namechanger (name) nametochange = name puts "This is the name to change: #{nametochange}" end 下面的第一个有效,第二个无效 namechanger("Steve") "Steve".namechanger 我在“Steve.namech

是否只有核心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)
rb:21:in`:private方法'namechanger'为“Steve”调用:String(NoMethodError)

是的,您可以向String类添加方法以实现所需的效果;变量“
self
”是指接收方法调用的对象

class String
  def namechanger
    "This is the name to change: #{self}"
  end
end
"Steve".namechanger # => This is the name to change: Steve

这种做法被称为,应谨慎使用。

是的,您可以向String类添加方法以达到所需的效果;变量“
self
”是指接收方法调用的对象

class String
  def namechanger
    "This is the name to change: #{self}"
  end
end
"Steve".namechanger # => This is the name to change: Steve

这种做法被称为,应该小心使用。

这里的第一种形式是一种采用参数的方法,这与不采用任何参数的方法非常不同。让我举例说明

ruby
更名者(“史蒂夫”)

查找名为
namechanger
的方法,并向其传递字符串参数。直截了当。它在一些未知的上下文中查找,可能是另一个方法的局部变量,该方法将在接收该方法的对象上查找它

ruby
“史蒂夫”,换名字


是一个不接受
字符串上存在的参数的方法。通常,这些方法使用隐式
self
参数对某些数据进行操作。

这里的第一种形式是一种采用参数的方法,这与不采用任何参数的方法非常不同。让我举例说明

ruby
更名者(“史蒂夫”)

查找名为
namechanger
的方法,并向其传递字符串参数。直截了当。它在一些未知的上下文中查找,可能是另一个方法的局部变量,该方法将在接收该方法的对象上查找它

ruby
“史蒂夫”,换名字


是一个不接受
字符串上存在的参数的方法。通常,这些方法使用隐式
self
参数对某些数据进行操作。

如果您希望能够调用
“Steve”。namechanger
,则必须使
namechanger
成为
字符串
类的方法,如下所示:

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end

这通常被称为“monkey patching”,在开始相关的注意事项和讨论之前,您可能希望提高您的Ruby总体熟练程度。

如果您希望能够调用
“Steve”.namechanger
,您必须使
namechanger
成为
String
类的一种方法,如下所示:

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end
这通常被称为“monkey patching”,在开始相关的注意事项和讨论之前,您可能希望提高您的Ruby总体熟练程度。

您可以这样做

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end
区别在于,您的第一个示例是一个(基本上)全局定义的方法,它接受一个字符串并对其进行操作。但是,上面的代码定义了一个名为“namechanger”的方法,该方法不接受任何参数,并直接在String类上定义它。因此,应用程序中的所有字符串都将使用此方法

但是正如pst所说,在您对Ruby稍微熟悉一点之前,您可能不应该深入研究这种编程风格,这样您就可以更容易地看到像这样进行monkeypatching的优点和缺点。需要考虑的一点是,您可能有许多不表示名称的字符串,而这些字符串使用名为namechanger的方法没有多大意义

这就是说,如果你的目标只是在Ruby上玩得开心一点,看看你能做些什么,那么就去做吧,但记住在使用寿命更长的项目中要更加小心。

你可以做到

class String
  def namechanger
    puts "This is the name to change: #{self}"
  end
end
区别在于,您的第一个示例是一个(基本上)全局定义的方法,它接受一个字符串并对其进行操作。但是,上面的代码定义了一个名为“namechanger”的方法,该方法不接受任何参数,并直接在String类上定义它。因此,应用程序中的所有字符串都将使用此方法

但是正如pst所说,在您对Ruby稍微熟悉一点之前,您可能不应该深入研究这种编程风格,这样您就可以更容易地看到像这样进行monkeypatching的优点和缺点。需要考虑的一点是,您可能有许多不表示名称的字符串,而这些字符串使用名为namechanger的方法没有多大意义


也就是说,如果你的目标只是在Ruby上玩得开心一点,看看你能做些什么,那么就去做吧,但记住在使用寿命更长的项目中要更加小心。

你可以一直子类化,而不是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
    
    class PersonName
    您可以始终使用子类来代替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
    
    class PersonName
    好吧,问题是什么错误信息?那为什么它有意义呢?虽然您可以在Ruby中“打开类”,但这也会导致大量污染。也许您希望遵循一种模式,例如
    Person.new(“Steve”).change\u name(“Fred”)
    ?请注意
    obj.m
    a