如何正确地用Ruby编写多行算法?以前,我尝试过类似y的东西,然后我意识到该代码有问题。我需要写多行算术,因为我的方程很长。
a = 5
b = 5
x = (a + b) / 2
puts x # 5, as expected
y = (
a
+ b
) /
2
puts y # 2, what happened?发布于 2014-06-15 00:20:29
Ruby解析器将假设语句已经结束,如果它看起来已经结束在行的末尾。
要防止这种情况,请将算术操作符放在新行的前面,如下所示:
a = 1
b = 2
c = a +
b你就会得到你想要的结果。
发布于 2014-06-15 00:19:01
(
expr1
expr2
)实际上,在Ruby中,与
(expr1; expr2)它只执行第一个表达式(用于副作用)并返回第二个表达式(也是在对其进行评估之后)。
发布于 2014-06-15 14:45:35
试着考虑解释器的“期望”,记住,在ruby中,一切都是一个表达式(这意味着所有的东西都有某种价值,甚至在其他语言中都被认为是“特殊的”,比如if-elses,循环等等)。
所以:
y = ( #1
a #2
+ b #3
) / #4
2 #5在第1行,我们开始一个变量的声明,这一行以一个打开的(挂起)括号结尾。解释器需要定义的其余部分,因此它继续到下一行,寻找要分配给var y的值。
在第2行,解释器找到变量a,但没有括起括号。它计算a,它有值5,而且由于第2行是一个完全有效的表达式,解释器理解这个表达式已经完成(因为在Ruby换行符中通常意味着表达式结束)。因此,到目前为止,它已经产生了一个值5,但它仍然拥有的唯一期望是,它必须匹配括起来的括号。
如果在此之后,解释器找到了括起来的括号,它就会将a (i.e. 5)的值分配给括号表达式(因为所有东西都必须有一个值,最后产生的值将被使用)。
当解释器到达第3行时,它会找到另一个完全有效的ruby表达式+ b。由于+ 5 (5是变量b的值)是ruby中的一个有效整数声明,所以解释器认为它是独立的,与之前为变量a计算的5无关(记住,除了圆括号外,它没有其他期望)。简而言之,它丢弃了为a获得的值,只使用了+ b获得的值。在下一行中,它找到了括起来的括号,因此括号表达式被分配给最后一个产生值,这是表达式+ b生成的一个+ b。
由于解释器在第4行找到了一个/,所以它(正确地)将它理解为整数的除法,因为到目前为止它已经生成了一个整数( int 5)!这就为该方法的可能参数创建了期望,它在第5行中找到了该方法。得到的求值表达式是y = 5 / 2,它等于整数除法中的2。因此,基本的,以下是翻译所做的工作:
y = ( # Ok, i'm waiting for the rest of the parenthesis expression
a # cool, a has value 5, if the parenthesis ends here, this is the value of the expr.
+ b # Oh, but now I found + b, which has value + 5, which evaluates to 5. So now this is the last value I have evaluated.
) / # Ok, the parenthesis have been closed, and the last value I had was a 5. Uow, wait, there is a slash / there! I should now wait for another argument for the / method of the 5 I have!
2 # Found, let's make y = 5 / 2 = 2!这里的问题是,在第2行,您应该为解释器留下一个期望(就像您在第4行中使用/方法时一样),而不是这样!
@Maur的回答恰恰说明了这一点:
y = (
a +
b
) /
2通过将+方法移到第2行的末尾,您可以告诉解释器您的表达式仍未完成!因此,它保持期望,然后继续到第3行,以找到表达式的正确操作数(或者,更准确地说,在Ruby中是+方法的一个参数:D)。
对于字符串连接也是如此:
# WRONG, SINCE + "somestring" is not a valid stand-alone expression in ruby
str = "I like to"
+ " move it!"
# NoMethodError: undefined method `+@' for " move it!":String
# CORRECT, by leaving the + sign as last statement of the first line, you
# keep the 'expectation' of the interpreter for the next
# argument of the + method of the string object "I like to"
str = "I like to" +
" move it!"
# => "I like to move it!" 区别在于,在代码中没有引发错误,因为+b实际上是一个有效的表达式。
我希望我的回答是有用的,给你一些直觉,为什么它不像预期的那样起作用,抱歉,如果我不简明扼要:)
https://stackoverflow.com/questions/24225456
复制相似问题