Ruby 点语法与参数传递语法
是否只有核心Ruby方法可以使用object.functionName语法调用?是否可以自己创建可以点语法方式调用的方法 对于此方法: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
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