我写了一个非常简单的 User 类。实例变量 email 有一个 reader 访问器和我自己的 writer 访问器,它们使用正则表达式验证电子邮件地址。
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 访问器设置?
我是该语言的新手,我正在尝试了解最佳实践。