0

在 Crystal 编译器源代码中我见过这样的代码

def dirname
  filename = @filename
  if filename.is_a?(String)
    File.dirname(filename)
  else
    nil
  end
end

def original_filename
  case filename = @filename
  when String
    filename
  when VirtualFile
    filename.expanded_location.try &.original_filename
  else
    nil
  end
end

def <=>(other)
  self_file = @filename
  other_file = other.filename
  if self_file.is_a?(String) && other_file.is_a?(String) && self_file == other_file
    {@line_number, @column_number} <=> {other.line_number, other.column_number}
  else
    nil
  end
end

那么,将实例变量分配给局部变量而不是直接使用实例变量的原因是什么?

4

1 回答 1

4

因为@filename 可能在我们检查它是否不为零(如果@filename)和我们访问它的时间之间同时更改。Crystal 是一个已编译的程序,如果 @filename 不是预期的类型,那么程序会因段错误而崩溃。

通过分配给局部变量,我们确保该变量确实存在。

于 2015-09-17T19:35:31.390 回答