在ruby中创建对象特定方法的不同方法
我只知道在ruby中创建实例特定方法的一种方法,即在ruby中创建对象特定方法的不同方法,ruby,Ruby,我只知道在ruby中创建实例特定方法的一种方法,即 class Test;end obj1 = Test.new class << obj1 def greet p 'Welcome' end end obj1.greet # "Welcome" obj2 = Test.new obj2.greet # through error as, Traceback (most recent call last): NoMethodError (
class Test;end
obj1 = Test.new
class << obj1
def greet
p 'Welcome'
end
end
obj1.greet # "Welcome"
obj2 = Test.new
obj2.greet # through error as,
Traceback (most recent call last):
NoMethodError (undefined method `greet' for #Test:0x0000564fb35acef0>)
或
我有两个问题:
这种特定于对象的方法在现实世界中有什么用途?
在Ruby中创建特定于对象的方法还有哪些不同的方法?
您已经将class block定义为class您已经根据@mu_is_too_简短注释将class block定义为class,另一种方式是
class Test; end
obj1 = Test.new
def obj1.pancakes
p 'Where is pancakes house?'
end
obj1.pancakes # "Where is pancakes house?"
obj2 = Test.new
obj2.pancakes
Traceback (most recent call last) :
NoMethodError
(undefined method `pancakes' for #<Test:0x0000564fb35ca310>)
根据@mu_is_too_的简短评论,另一种方式是
class Test; end
obj1 = Test.new
def obj1.pancakes
p 'Where is pancakes house?'
end
obj1.pancakes # "Where is pancakes house?"
obj2 = Test.new
obj2.pancakes
Traceback (most recent call last) :
NoMethodError
(undefined method `pancakes' for #<Test:0x0000564fb35ca310>)
以下是一些创建散列的方法,而不是
class << obj
def greet
...
end
end
一,
二,
此表单在动态创建单例方法时非常有用
三,
四,
五,
六,
七,
创建单例方法的实际用途对于包括类在内的模块来说是显而易见的,但由于它涉及到其他对象,因此需要征求意见
以下是一些创建散列的方法,而不是
class << obj
def greet
...
end
end
一,
二,
此表单在动态创建单例方法时非常有用
三,
四,
五,
六,
七,
创建单例方法的实际用途对于包括类在内的模块来说是显而易见的,但由于它涉及到其他对象,因此需要征求意见。用例示例:假设您有使用散列作为数据结构的生产代码。随着时间的推移,类似乎是更好的选择,因为需要比仅仅保存数据更智能的行为——例如,应该验证实例数据。此验证代码仅在该特定哈希的上下文中有意义。您可以在公共名称空间或某些模块中定义一个方法validate_username,但要定义_hash.validate_username;密码end可以说是一个更好的解决方案。用例的一个示例:假设您有使用散列作为数据结构的生产代码。随着时间的推移,类似乎是更好的选择,因为需要比仅仅保存数据更智能的行为——例如,应该验证实例数据。此验证代码仅在该特定哈希的上下文中有意义。您可以在公共名称空间或某些模块中定义一个方法validate_username,但要定义_hash.validate_username;密码end可以说是一个更好的解决方案。是的,1可以有广泛的用途,但请至少提供一些。1一个常见的现实世界和日常使用的类方法。这些是在类对象上定义的,而不是在类对象的类上定义的,以便将其范围限制在该特定对象上。是的,1可以有广泛的用途,但请至少提供一些。1常见的现实世界和日常使用的是类方法。它们是在类对象上定义的,而不是在类对象的类上定义的,以便将它们的作用域限制在该特定对象上。这个魔术有Objectdefine\u singleton\u方法,不需要使用define\u方法。@halfelf Yes,define_singleton_方法将为对象定义singleton方法,但我将为任何类定义实例方法让路,以便任何实例都可以访问该方法。如果我错过了,请更正something@halfelfOP对定义对象特定的方法感兴趣,所以我将编辑答案来添加这一点。这个魔术有Objectdefine\u singleton\u方法,不需要使用define\u方法。@halfelf是,define_singleton_方法将为对象定义singleton方法,但我将为任何类定义实例方法让路,以便任何实例都可以访问该方法。如果我错过了,请更正something@halfelfOP对定义特定于对象的方法感兴趣,所以我将编辑答案以添加此点,或者简单地定义obj.greet;'你好!;end@Stefan,我没有包括这一点,因为它包含在另一个答案中。事实上,我编写了上面显示的编辑,但显然没有保存它你好!;end@Stefan,我没有包括这一点,因为它包含在另一个答案中。事实上,我写了上面显示的编辑,但显然没有保存它。
class << obj
def greet
...
end
end
def obj.greet
...
end
obj.singleton_class.class_eval do
def greet1
'Welcome'
end
end
obj.greet1 #=> "Welcome"
obj.singleton_class.class_eval "def greet2
'Get lost'
end"
obj.greet2 #=> "Get lost"
obj.singleton_class.instance_eval do
define_method(:greet3) { 'yo' }
end
obj.greet3 #=> "yo"
obj.singleton_class.
public_send(:define_method, :greet4) { 'yo-yo' }
obj.greet4 #=> "yo-yo"
obj.define_singleton_method(:greet5) { 'yo who?' }
obj.greet5 #=> "ho who?"
module M
def greet6
'hi ya'
end
end
obj.extend M
obj.greet6 #=> "hi ya"
module M
def greet7
'hi you'
end
end
obj.singleton_class.include M
obj.greet7 #=> "hi you"
obj.methods(false)
#=> [:greet3, :greet4, :greet1, :greet2, :greet5]
obj.methods.grep /greet/
#=> [:greet3, :greet4, :greet1, :greet2, :greet5,
# :greet6, :greet7]