Ruby有定义类方法的快捷方式
def String.some true end p String.some
是否有类似的快捷方式来定义示例方法?
def <???>.some true end p "".some
P.S.也可以请你提到链接到文档有关的快捷方式语法。
lb3vh1jj1#
这不是一个类方法。Ruby没有类方法。这只是一个普通的单例方法,只是它所定义的对象恰好是Class类的示例。我们简单地使用术语“类方法”来指“一个对象的单例方法,该对象恰好是Class类的示例”,因为这更简短,但在Ruby编程语言中,没有类方法这样的东西。对象没有理由必须是Class类的示例,它可以是(几乎)任何对象(只要它不是冻结或立即的):
Class
some_obj = Object.new def some_obj.foo = :bar some_obj.foo #=> :bar
除了...我撒了谎Ruby也没有单例方法。这只是some_obj的单例类的示例方法。我们简单地使用术语“单例方法”来指代“单例类的示例方法”,因为这样说更简短,但在Ruby编程语言中,没有单例方法这样的东西。(core library 中有几个方法讨论了单例方法,但它们都只操作单例类的示例方法。再说一次,谈论它们很方便,但它们根本不存在。)类似地,我们谈论“类方法”,因为这更容易说“一个对象的单例类的示例方法,该对象是Class类的示例”,但从根本上说,类方法不存在。是否有类似的快捷方式来定义示例方法?你上面写的 * 确实 * 定义了示例方法。some是String的单例类的示例方法:
some_obj
some
String
String.singleton_class.instance_methods(false) #=> [:try_convert, :some]
axkjgtzd2#
是的,你可以像下面这样使用单例方法
instance = "Rajagopalan" def instance.some_instance_method puts "Hi, this is Rajagopalan" end instance.some_instance_method
这对数字不起作用。如果你想为Numeric对象添加方法,你可以像这样打开Numeric类,然后在那里添加你的方法
class MyNumeric < Numeric def some_instance_method "it's a numeric value" end end instance = MyNumeric.new puts instance.some_instance_method
vxf3dgd43#
def String.some true end
这是向对象添加单例方法的快捷方式。任何对象都可以工作,String或"str"都是对象,只是属于不同的类。
"str"
至于示例方法的快捷方式,有一个方法:
String.define_method(:some) { "some " + self } >> "say".some => "some say"
dkqlctbz4#
我猜你是想在某个类已经定义好之后再给它添加一个示例方法。在Ruby中,你可以重新打开类来定义额外的东西。它被称为"monkey patching"。下面是一个示例:
class String def with_greeting "Hello #{self}" end end "Anon".with_greeting # => "Hello Anon" # Existing methods of String still work: "Anon".size # => 4
或者,您可以像这样使用#define_method:
#define_method
String.define_method(:with_bye) { "Bye #{self}" } "Anon".with_bye # => "Bye Anon"
4条答案
按热度按时间lb3vh1jj1#
Ruby有定义类方法的快捷方式
这不是一个类方法。Ruby没有类方法。这只是一个普通的单例方法,只是它所定义的对象恰好是
Class
类的示例。我们简单地使用术语“类方法”来指“一个对象的单例方法,该对象恰好是Class
类的示例”,因为这更简短,但在Ruby编程语言中,没有类方法这样的东西。对象没有理由必须是
Class
类的示例,它可以是(几乎)任何对象(只要它不是冻结或立即的):除了...我撒了谎Ruby也没有单例方法。这只是
some_obj
的单例类的示例方法。我们简单地使用术语“单例方法”来指代“单例类的示例方法”,因为这样说更简短,但在Ruby编程语言中,没有单例方法这样的东西。(core library 中有几个方法讨论了单例方法,但它们都只操作单例类的示例方法。再说一次,谈论它们很方便,但它们根本不存在。)类似地,我们谈论“类方法”,因为这更容易说“一个对象的单例类的示例方法,该对象是
Class
类的示例”,但从根本上说,类方法不存在。是否有类似的快捷方式来定义示例方法?
你上面写的 * 确实 * 定义了示例方法。
some
是String
的单例类的示例方法:axkjgtzd2#
是的,你可以像下面这样使用单例方法
这对数字不起作用。如果你想为Numeric对象添加方法,你可以像这样打开Numeric类,然后在那里添加你的方法
vxf3dgd43#
这是向对象添加单例方法的快捷方式。任何对象都可以工作,
String
或"str"
都是对象,只是属于不同的类。至于示例方法的快捷方式,有一个方法:
dkqlctbz4#
我猜你是想在某个类已经定义好之后再给它添加一个示例方法。
在Ruby中,你可以重新打开类来定义额外的东西。它被称为"monkey patching"。下面是一个示例:
或者,您可以像这样使用
#define_method
: