在ruby中使用属性

您可以自己轻松地实现属性。通过定义setter和getter方法,您可以实现任何想要的属性。下面是一些实现person类的name属性的示例代码。它将名称存储在@name实例变量中,但名称不必相同。记住,这些方法没有什么特别之处。...

01

03年的

自己实现属性

Close up of woman's hands using laptop at home

您可以自己轻松地实现属性。通过定义setter和getter方法,您可以实现任何想要的属性。下面是一些实现person类的name属性的示例代码。它将名称存储在@name实例变量中,但名称不必相同。记住,这些方法没有什么特别之处。

#!/usr/bin/env ruby类person def initialize(name)@name=name end def name@name end def name=(name)@name=name end def say_hello puts“hello,{@name}”end

有一件事你会马上注意到,这是一个很大的工作。要输入一个名为name的属性来访问@name实例变量,需要大量的输入。幸运的是,Ruby提供了一些方便的方法来为您定义这些方法。

02

03年的

使用属性读取器、属性写入器和属性访问器

模块类中有三种方法可在类声明中使用。请记住,Ruby不区分运行时和“编译时”,类声明中的任何代码不仅可以定义方法,还可以调用方法。调用attr_reader、attr_writer和attr_accessor方法将依次定义我们在上一节中定义的setter和getter。

attr_reader方法的功能与听起来的一样。它接受任意数量的符号参数,并为每个参数定义一个“getter”方法,该方法返回相同名称的实例变量。因此,我们可以用attr_reader:name替换前面示例中的name方法。

类似地,attr_writer方法为传递给它的每个符号定义一个“setter”方法。请注意,等号不必是符号的一部分,只需是属性名称。我们可以用调用attr_writer:name来替换前面示例中的name=方法。

而且,正如预期的那样,attr_访问器同时完成attr_编写器和attr_读取器的工作。如果属性同时需要setter和getter,通常不单独调用这两个方法,而是调用attr_accessor。我们可以用对attr_accessor:name的单个调用来替换前面示例中的name和name=方法。

#!/usr/bin/env ruby def person attr_accessor:name def initialize(name)@name=name end def say_hello puts“hello,{@name}”end

03

03年的

为什么手动定义setter和getter?

为什么要手动定义setter?为什么不每次都使用attr_*方法呢?因为它们破坏了封装。封装是声明外部实体不应对对象的内部状态具有无限制访问权限的原则。应使用防止用户破坏对象内部状态的接口访问所有内容。使用上述方法,我们在封装墙上打了一个大洞,允许为名称设置任何内容,甚至是明显无效的名称。

您经常会看到,attr_reader将用于快速定义getter,但将定义自定义setter,因为对象的内部状态通常希望直接从内部状态读取。然后手动定义setter,并进行检查以确保所设置的值有意义。或者,也许更常见的是,根本没有定义setter。类函数中的其他方法以其他方式在getter后面设置实例变量。

现在,我们可以添加年龄并正确实现名称属性。可以在构造函数方法中设置age属性,使用age getter读取,但只能使用have_birth方法进行操作,这将增加age。name属性有一个普通的getter,但是setter确保名称是大写的,并且是Firstname-Lastname的形式。

#!/usr/bin/env ruby class person def initialize(name,age)self.name=name@age=age end attr_reader:name,:age def name=(new_name)如果new_name=~/^[a-z][a-z]+[a-z][a-z]+$/@name=new u name其他地方放“'.{new new u name}不是有效的名字!”end def have_birth放“生日快乐”{@age+=1 end def whoami放“你是”{name}我是谁?p、 whoami#她结婚了p.name=“alice brown”#她试图成为一名古怪的音乐家p.name=“a”#但失败了#她变老了一点p.have#你过生日了吗#我又是谁?p、 哇

  • 发表于 2021-10-10 08:19
  • 阅读 ( 194 )
  • 分类:编程

你可能感兴趣的文章

红宝石(ruby)和python(python)的区别

...优点是这些语言支持面向对象编程(OOP)。OOP方法有助于使用对象对一个或一组程序进行建模。Ruby和Python的关键区别在于Ruby主要用于web开发,而Python主要用于各种应用程序,包括web开发。Python还常用于科学计算、数据科学应用...

  • 发布于 2020-10-19 17:41
  • 阅读 ( 338 )

最适合新手的ruby互动介绍

...教程将教您语言的绝对基本构建块(包括数字、字符串、属性和方法)。您只需要键入像“2+6”这样简单的东西,看看Ruby如何处理数学操作符。 ...

  • 发布于 2021-03-13 09:52
  • 阅读 ( 215 )

使用静态站点生成器快速构建网站

... 欢迎使用MakeUseOf指南来使用静态站点生成器。在本指南中,我们将介绍什么是静态站点生成器(SSG),为什么要使用它,以及如何使用它构建一个全新的站点。我们将探讨的一...

  • 发布于 2021-03-25 19:23
  • 阅读 ( 306 )

python(python)和红宝石(ruby)的区别

...方版本,随着时间的推移,它成为社区中最流行和最广泛使用的第一个编程语言之一。它是一种功能强大的高级编程语言,但更易于学习和掌握。Python的强大功能常常被比作Perl,但它的语法要简单得多,代码可读性也很高。最...

  • 发布于 2021-06-25 22:26
  • 阅读 ( 246 )

python(python)和javascript语言(javascript)的区别

...单。他们都是第一语言最佳人选。JavaScript无疑是最容易使用的web编程语言之一。在目前和可预见的未来,只有一种基于浏览器的编程语言。JavaScript在很短的时间内从不存在到全球采用,这意味着什么。然而,由于一项技术很容...

  • 发布于 2021-06-25 22:27
  • 阅读 ( 268 )

perl语言(perl)和红宝石(ruby)的区别

...Perl比Ruby更支持Unicode。 结论 这两种语言都更容易学习和使用。此外,他们在世界各地都有庞大的社区。Perl和Ruby的主要区别在于Ruby比Perl提供了更多的面向对象支持。 引用 1、“Perl”维基百科,维基媒体基金会,26,1月2019日,...

  • 发布于 2021-07-01 12:05
  • 阅读 ( 368 )

红宝石(ruby)和ruby on rails(ruby on rails)的区别

...x。rubyonrails也称为Rails。Rails与所有公共数据库兼容。 它使用了一个称为Convention over Configuration的概念,因为在编写代码时只剩下很少的配置。Rails在HTTP服务器上运行。因此,Ruby和Rails既有联系又有区别;Ruby是一种高级编程语言...

  • 发布于 2021-07-12 08:27
  • 阅读 ( 249 )

ruby for kids教你的孩子(和你自己)ruby编程语言

...uby for kids是一个网站,它为新的程序员(无论老少)提供使用Ruby编程语言的指导和屏幕广播。Ruby4Kids网站首先解释了您需要在系统上满足的先决条件,然后再进入更困难的级别。这些屏幕广播是在macosx中完成的,但是可以在任...

  • 发布于 2021-07-25 04:52
  • 阅读 ( 173 )

ruby中的全局变量

...它们以$(美元符号)字符开头表示。然而,全局变量的使用通常被认为是“非Ruby”,并且您很少看到它们。 定义全局变量 全局变量的定义和使用与任何其他变量一样。要定义它们,只需给它们赋值并开始使用它们。但是,...

  • 发布于 2021-09-05 06:00
  • 阅读 ( 175 )

使用logger库-如何在ruby中编写日志消息

在Ruby中使用logger库是跟踪代码何时出错的一种简单方法。当出现错误时,详细说明导致错误的原因可以节省查找错误的时间。随着程序变得越来越大、越来越复杂,您可能需要添加一种写入日志消息的方法。Ruby附带了许多有用...

  • 发布于 2021-09-12 07:28
  • 阅读 ( 192 )
cu705295
cu705295

0 篇文章

相关推荐