gpt4 book ai didi

ruby - 在 Ruby 中有类似 JavaScript 提升的东西吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:22:21 24 4
gpt4 key购买 nike

我想知道在 Ruby 中是否可以在声明之前使用变量和方法。 JavaScript 中有类似提升的东西吗?

def calcArea
getWidth * getHeight
end

def getWidth
@w
end
def getHeight
@h
end
@w = 10
@h = 20

p calcArea

最佳答案

I am wondering if variables and methods can be used before declaration in Ruby.

变量不需要在 Ruby 中声明,所以这部分问题没有意义。变量在第一次被赋值时就存在了,或者,对于局部变量,当它们的第一次赋值被解析时。

方法是定义的,而不是声明的。方法定义是一段代码,就像任何其他代码段一样。需要执行才能生效。您不能调用不存在的方法,方法只有在其定义执行后才存在。

Is there something like hoisting in JavaScript?

没有。

def calcArea
getWidth * getHeight
end

def getWidth
@w
end
def getHeight
@h
end
@w = 10
@h = 20

p calcArea

这很好用,但与提升无关。您只需在定义 calcArea 之后调用它,这样就完全没问题了。 calcArea 调用 getWidthgetHeight,但只有当 calcArea 本身被调用时,这在 all 方法已经定义,所以没关系。 getWidthgetHeight 访问 @w@h,但同样,在 getWidthgetHeight 被调用,@w@h 已经被赋值,所以也可以。 (即使它们没有被分配,访问它们仍然不是一个错误,访问一个不存在的实例变量只是评估为nil;显然,你会尝试在 nil 上调用 * 时得到一个 NoMethodError,但这与为非 nil 得到一个 NameError 有很大不同-存在变量。)

关于编码风格的一些注意事项:

  • Ruby 对方法、参数、局部变量、实例变量、类变量和全局变量使用 snake_case
  • Ruby 不为 getter 使用 get 前缀。
  • 普通 getter 的命名应与实例变量相同。
  • 此外,calcArea 基本上是该区域的 setter/getter ,因此它的命名也应不带前缀。
  • 方法定义后应有一个空行。

因此,根据 Ruby 社区风格,您的代码应该如下所示:

def area
width * height
end

def width
@width
end

def height
@height
end

@width = 10
@height = 20

p area

如果这是模块或类定义的一部分,那么您可以使用 attr_reader 自动生成 getter,并使用 attr_writer 生成 setter:

class Rectangle
attr_reader :width, :height

def area
width * height
end

private

attr_writer :width, :height

def initialize(width, height)
self.width, self.height = width, height
end
end

rect = Rectangle.new(10, 20)

p rect.area

关于ruby - 在 Ruby 中有类似 JavaScript 提升的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com