此代码工作:

class Hello
  def initialize
    @name = "Paul"
  end

  def say_name(maybe_name)
    name = self.name
    case maybe_name
    in ^name
      puts "Hello, Paul!"
    else
      puts "No match"
    end
  end

  private

  attr_reader :name
end

Hello.new.say_name("Paul") # "Hello, Paul!"

但是,如果我删除name = self.name,我得到的是一个非局部变量名为固定变量.

这是Ruby中的bug,还是故意的?我想它只适用于局部变量?如果我删除这一行,namesay_hello方法中为nil,但它是被定义的.

推荐答案

这是Ruby中的bug,还是故意的?

这个错误是故意的.当引用一个不存在的局部变量时,你会得到一个异常.

我想它只适用于局部变量?

它适用于任何类型的变量,如docs:"you can also pin instance, global, and class variables"所述.然而,普通的^variable语法不适用于methods.为了让代码工作,你必须直接引用实例变量@name:

case maybe_name
in ^@name
  # ...
end

或者使用允许"pin the result of arbitrary expressions using parentheses"^(expression)语法(其中"任意表达式"是一个方法调用)

case maybe_name
in ^(name)
  # ...
end

Ruby相关问答推荐

为什么 ruby​​ 获得证书信任链与 gnutls-cli 不同

在 Ruby 中,如何编写一个可以与 &:symbol 一起使用的简单方法?

ruby:rubocop 抱怨将 if else 转换为 case 语句

Ruby $:.unshift File.dirname(__FILE__)

Ruby 相当于 Groovy 的 Elvis (?:) 运算符?

如何在新行之间拆分字符串并保留空白行?

ruby中字符的整数值?

拆分 Ruby 字符串时如何保留分隔符?

判断字符串是否包含Ruby数组中的任何子字符串

Ruby 中的 main是什么?

如果尚未定义,则设置 Ruby 变量

Puppet/Facter无法检索事实 fqdn:如何修复或规避?

从字符串中删除所有特殊字符 - ruby

从命令行使用Bundle 器将 gem 添加到 gemfile

错误数量的参数(1 代表 0)在 Ruby 中是什么意思?

默认情况下需要查找的路径是什么?

Ruby - 无法修改冻结的字符串 (TypeError)

如何在 gemspec 中指定最低 Ruby 版本?

在 Ruby 中创建二维数组和访问子数组

你可以在Ruby中使用分号吗?