Ruby 函数名容易与变量名冲突

hgyxbll · 2016年12月27日 · 最后由 bianjp 回复于 2016年12月29日 · 2750 次阅读

ruby 的函数名是小写加下划线,变量名也是小心加下划线,写的时候应该很容易冲突 (即重名) 吧. 大家有没有这种情况。

不过小写函数名确实比较好看。

方法名用动词,变量名用名词

#1 楼 @piecehealth 很多时候方法名是名字,比如 File.log_size,
如果此时我用 a = File.new() log_size = a.log_size 变量名就和函数名一样了,

  • 有作用域和优先级的
  • 变量名冲突的问题是习惯导致的,和命名风格没关系,你可以有很多方式避免
  • 实际的使用场景中,我们时常可能会故意声明一个和变量(或 attr)名称相同的函数,这是 Ruby 的特性例如:
class Foo
  attr_accessor :name

  def name
    return 'None' if @name.blank?
    @name
  end
end

#2 楼 @hgyxbll log_size 和 a.log_size 不冲突啊。

#4 楼 @Rei 这里名字已经相同了,幸好是在 File 类外面,如果在 File 类里某个函数定义一个 log_size 变量,然后调用函数 log_size 赋值,再进行一些运算,不知道大家有没有碰到这种情况?

#3 楼 @huacnlee 有时我们定义了一些全局函数,比例 log_size, 然后在某个地方我们会定义局部变量 log_size = log_size(), 然后对这个局部变量进行计算,这就涉及到名字冲突,或者不易读,这两个名字改如何命名才能又易读又不冲突呢?这命名就是我所烦恼的事情,不知你有没有碰到过,对这种情况改如何解决. PS: 类型命名比较好,不会和变量冲突,比如 AlarmInfo, 定义变量 alarm_info.

如果函数是无需参数的,那就别用局部变量,每次都调用函数。

如果该函数计算很耗性能,就用该函数所属类的实例变量缓存一下

即使那个类不是你自己写的,也可以 prepend、extend 来制造缓存吧

我刚用 ruby 的时候也遇到这个问题 后来我都是优先使用方法

f = Foo.new
f.name = "12" # 属性
f.name # 方法调用

 是这样的吗?我测试了一下是这样的

#9 楼 @helapu 其实都是方法调用

摘自 Programming Ruby 1.9&2.0

需要 登录 后方可回复, 如果你还没有账号请 注册新账号