如果行为不同,Ruby if if vs end?
为什么这段代码不起作用?
b if b = true
错误: undefined local variable or method `b'
但这样做:
if b = true b end
它们不应该是一样的吗?
这个问题问得好。 它与Ruby中的变量范围有关。
以下是Matz关于Ruby bug跟踪器的post :
局部变量范围确定为向下,从左到右。 因此,如果是主体,则在if修饰符的条件下首先分配的局部变量在左侧无效。 这是一个规范。
在第一个版本中,一旦k
被击中,解析器就会因为尚未被看到而呕吐。
在第二个版本中, k
是赋值表达式的一部分,并且以不同方式进行解析。
我不知道原因,但解释器在评估条件之前尝试查找变量k
的问题。
如果你这样写,它将不会有任何错误,并按预期工作:
k = nil h = {k: 1} v = k if k = h.delete(:k)
因为Ruby解释器在看到赋值时会创建一个局部变量
在第二种情况下,它还没有看到赋值,因此在解析表达式时变量不存在。
更确切地说,首先将方法解析为内部表示,然后,最终可能会调用并实际执行代码。
在该解析过程中创建局部变量。 这是一个声明问题,它只是意味着解释器会意识到它们。 在被某人调用周围方法之前,它们不会被赋予空间或值的意义。
你只放了一个’=’
试试’==’
然后你会得到错误
在第二个示例中,您将为b分配’true’。
- 尝试生成设计时出错:在Ruby on Rails中安装
- 如何动态地将部分添加到SitePrism页面对象?
- 在RSpec请求规范中对控制器操作进行存根
- 显示用户输入的ASCII-8BIT字符时出现“不兼容的字符编码:UTF-8和ASCII-8BIT”错误
- 将XPath与HTML或XML片段一起使用?
- RVM | 运行用户脚本
- Selenium 2.0 Webdriver&Ruby,除.text之外的链接元素方法? Navigate.to数组中的链接?
- 如何查找MASSIVE数组中的哪些项目不止一次出现?
- dump elasticsearch 2.x to mongodb and back to ES 6.x.