方法只针对一个实例?他们在Ruby中称之为什么?

方法只针对一个实例?他们在Ruby中称之为什么?,第1张

概述我知道有“实例方法”,“类方法”,但这些类型的方法被称为,例如: s1 = "This is my STRING!"def s1.m1 downcaseendp s1 # => "This is my STRING!"p s1.m1 # => "this is my string!" 什么类型的方法是在“字符串”类的s1“实例”上调用的“m1”方法?这真的很奇怪,因为如 我知道有“实例方法”,“类方法”,但这些类型的方法被称为,例如:

s1 = "This is my STRING!"def s1.m1  downcaseendp s1     # => "This is my STRING!"p s1.m1   # => "this is my string!"

什么类型的方法是在“字符串”类的s1“实例”上调用的“m1”方法?这真的很奇怪,因为如果我尝试的话,我根本不知道这是可能的:

s2 = "This is ANOTHER string"s2.m1 # => Won't work!

哪种有意义,但不确定为什么在类的实例上定义像m1这样的方法是有用的.

解决方法 它们被称为单例方法,可以定义如下:

class Person  def favorite_meal    "Big Mac"  endendFred,Joe = 2.times.map { Person.new }def Fred.favorite_meal  "Le Big Mac"endJoe.favorite_meal #=> Big MacFred.favorite_meal #=> Le Big Mac

定义相同单例方法的其他方法是:

Fred.define_singleton_method :favorite_meal do "Le Big Mac" end

和:

class << Fred  def favorite_meal    "Le Big Mac"  endend

愿原力与你同在.

更新:回答评论中的2个问题.

让我从第二个开始.无论您使用常量还是变量,都取决于您.写fred = Person.new是完全可以的.但:

>具有不同属性的对象通常应该具有正确的名称,这些名称是正确的.
>我写了一个有用的宝石y_support / name_magic,它通过赋值给常量来工作.

通过gem install y_support安装它,并尝试:

require 'y_support/name_magic'class Dog  include nameMagic  def speak; puts "Bow wow!" endendSpot,Rover = 2.times.map { Dog.new }

现在Dog类知道它的实例,实例知道它们的名字.

Dog.instances.map { |dog| dog.name } #=> :Spot,:RoverDog.instances.names # the simpler way to say the same

这在这个特定的例子中没有用(并且在其他地方非常有用),但无论如何,它给了我一个习惯,即给予具有个性特征的对象.

至于第一个问题,def Fred.foobar是最基本的,一次性的单例方法定义.如果要在单例类中定义多个单例方法或别名或包含模块,请使用class<<弗雷德:

module Foo  def bar; "Fretbar!" endendclass << Fred  include Foo  alias le_favorite favorite_mealendFred.bar #=> Fretbar!Fred.le_favorite #=> "Le Big Mac"

使用Fred.define_singleton_method语法可以实现最高级的功能,并且使用第4种方法,我之前没有提到过:

local_var = 42Fred.singleton_class.class_exec do  define_method :baz do local_var + 1 endendFred.baz #=> 43

这种方式使用闭包,它保留与变量local_var的绑定.试试看

local_var = 32Fred.baz #=> 33

所以这是关于闭包语法的特殊之处,它通常是一个天赐之物,可以神奇地解决令人讨厌的编程问题.

总结

以上是内存溢出为你收集整理的方法只针对一个实例?他们在Ruby中称之为什么?全部内容,希望文章能够帮你解决方法只针对一个实例?他们在Ruby中称之为什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1283838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存