在ruby中,就像在任何其他语言中一样,我们可以像这样获取和设置内置类型
var1 = 12
if var1 > 10
var1 = 90
end
现在让我们假设我是一个愚蠢的傻瓜,只想处理(例如)无符号整数,并创建以下类
class UInteger
attr_accessor :value
...
end
有没有一种方法可以模拟内置变量getter和setter,以避免通过调用
uint.value
或
uint.value = ...
然后换成
uint
或
uint = ...
?
3条答案
按热度按时间6yt4nkrj1#
我们可以像这样获取和设置内置类型[...]
是的,但这绝不限于内置的“类型”。您可以在自定义类的示例中使用完全相同的代码。你只需要提供一个有意义的
>
方法,例如:(出于演示的目的,该类不做任何有用的事情)除此之外,代码结构保持不变:
你可以添加一个全局方法
UInteger()
来更容易地创建新示例(就像BigDecimal
一样),也可以添加一个自定义的inspect
方法,它类似于它的语法,用于技术性较低的输出:通过上述更改,代码变为:(这些变化纯粹是装饰性的,它仍然是
UInteger
的示例,就像以前一样)当然,
UInteger
示例 * 不是 * 一个实际的整数。如果你需要一个整数值,你必须转换它,例如:这与从内置类(如string)转换示例没有什么不同:
wribegjk2#
如前所述,您不能更改Ruby文字,您不能调用
uint
并返回Integer
的示例而不是UInteger
可能需要整数的decorator
或使用Active Support库的delegate和delegate_missing_to方法
然后你可以在这个
UInteger
中添加一些特定的方法,目前它是虚拟的,只是重复整数功能用法示例
r55awzrz3#
我的感觉是你在问是否可以在Ruby中创建一个自定义的文字,因为这是文字(字符串,整数,布尔值等)在Ruby中的行为方式。答案是no。
这对于
Object
类来说似乎是故意的,您的UInteger
类将自动继承它。由于您可以覆盖Object class上的任何方法,因此允许您覆盖对象本身的调用可能会产生大量问题。假设我这样做:如果我可以将
uint
重写为uint.value
,那么我就不能调用uint.timestamp
:如果我可以将
uint =
重写为uint.value =
,那么我总是将uint
重写为一个uint.value =
。