Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中创建对象特定方法的不同方法_Ruby - Fatal编程技术网

在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 (

我只知道在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 (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]