gpt4 book ai didi

ruby - 通过操作而不是分配来绕过写入器访问器

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:42 26 4
gpt4 key购买 nike

我写了一个非常简单的用户类。实例变量电子邮件有一个阅读器访问器和我自己的使用正则表达式验证电子邮件地址的编写器访问器。

class User
attr_reader :email

def email=(value)
if (value =~ /^[a-z\d\-\_\+\.]+@([a-z\d\-]+\.)+[a-z]+$/)
@email = value
else
# bonus question: is ArgumentError the right error type to use here?
raise ArgumentError, "#{value} is not a valid email address."
end
end
end

我写了下面的测试:

require 'test/unit'
require_relative '../lib/user'

class TC_UserTest < Test::Unit::TestCase
def setup
@user = User.new()
end

def test_email
# using the writer accessor
@user.email = 'user@example.com'
# bypassing the writer accessor. evil.
@user.email[4] = '#'
assert_equal('user@example.com', @user.email)
end
end

通过使用 reader 访问器给我的引用,我可以在不通过 writer 访问器的情况下操作 email 实例变量。

相同的原则适用于任何允许操作而无需使用 = 直接分配新值的数据类型

我是不是太过分了?我只想编写健壮的代码。有没有办法确保我的电子邮件地址只能使用 writer 访问器设置?

我是这门语言的新手,我正在尝试了解最佳实践。

最佳答案

使测试通过(并保护 @email 变量)的一个选项是公开一个副本。

def email
@email.dup
end

关于ruby - 通过操作而不是分配来绕过写入器访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com