ruby 是否要定义示例方法?

wj8zmpe1  于 12个月前  发布在  Ruby
关注(0)|答案(4)|浏览(137)

Ruby有定义类方法的快捷方式

def String.some
  true
end

p String.some

是否有类似的快捷方式来定义示例方法?

def <???>.some
  true
end

p "".some

P.S.也可以请你提到链接到文档有关的快捷方式语法。

lb3vh1jj

lb3vh1jj1#

Ruby有定义类方法的快捷方式

def String.some
  true
end

p String.some

这不是一个类方法。Ruby没有类方法。这只是一个普通的单例方法,只是它所定义的对象恰好是Class类的示例。我们简单地使用术语“类方法”来指“一个对象的单例方法,该对象恰好是Class类的示例”,因为这更简短,但在Ruby编程语言中,没有类方法这样的东西。
对象没有理由必须是Class类的示例,它可以是(几乎)任何对象(只要它不是冻结或立即的):

some_obj = Object.new

def some_obj.foo = :bar

some_obj.foo
#=> :bar

除了...我撒了谎Ruby也没有单例方法。这只是some_obj的单例类的示例方法。我们简单地使用术语“单例方法”来指代“单例类的示例方法”,因为这样说更简短,但在Ruby编程语言中,没有单例方法这样的东西。(core library 中有几个方法讨论了单例方法,但它们都只操作单例类的示例方法。再说一次,谈论它们很方便,但它们根本不存在。)
类似地,我们谈论“类方法”,因为这更容易说“一个对象的单例类的示例方法,该对象是Class类的示例”,但从根本上说,类方法不存在。
是否有类似的快捷方式来定义示例方法?
你上面写的 * 确实 * 定义了示例方法。someString的单例类的示例方法:

String.singleton_class.instance_methods(false)
#=> [:try_convert, :some]
axkjgtzd

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
vxf3dgd4

vxf3dgd43#

def String.some
  true
end

这是向对象添加单例方法的快捷方式。任何对象都可以工作,String"str"都是对象,只是属于不同的类。

  • https:ruby-doc.org/3.2.2/syntax/methods_rdoc.html#label-Scope*

至于示例方法的快捷方式,有一个方法:

String.define_method(:some) { "some " + self }

>> "say".some
=> "some say"
dkqlctbz

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

String.define_method(:with_bye) { "Bye #{self}" }

"Anon".with_bye # => "Bye Anon"

相关问题