Ruby中case语句的pinning为何无法直接配合attr_reader使用?
这是Ruby的有意设计,并非Bug
你的猜测没错——模式匹配中的pin操作符^仅支持局部变量,它不会去查找同名的实例方法(哪怕是attr_reader定义的name)。
具体原因:
Ruby模式匹配里,^var的核心作用是「固定」一个已存在的局部变量的值,用这个值来和匹配目标做相等性校验。语法上它要求后面必须绑定一个局部变量,不会自动去调用实例方法或查找其他作用域的变量。
两种场景分析:
保留
name = self.name时:
这行代码在say_name方法内定义了局部变量name,并把实例方法name(对应@name)的值赋值给它。此时^name能正确引用这个局部变量,匹配逻辑正常执行,输出Hello, Paul!。移除该行后:
方法内没有定义局部变量name,^name找不到对应的局部变量,就会抛出「pinned变量对应的局部变量name未定义」的错误。哪怕存在同名的实例方法,pin操作符也不会去调用它——这是设计上的明确规则。
替代方案(如果不想定义局部变量):
如果想用实例方法的值做匹配,可以用条件匹配的方式:
def say_name(maybe_name) case maybe_name in String if _1 == name puts "Hello, Paul!" else puts "No match" end end
内容的提问来源于stack exchange,提问作者Paul Byrne
相关产品推荐
相关产品推荐

