Ruby on rails Ruby/Rails中的附加参数

Ruby on rails Ruby/Rails中的附加参数,ruby-on-rails,ruby,methods,syntax,parameters,Ruby On Rails,Ruby,Methods,Syntax,Parameters,学习Ruby/Rails,并在ERB模板中遇到了以下问题: 有效: <%= link_to image_tag(link.screenshot.url(:thumb)), link.screenshot.url(:original) %> <%= link_to image_tag link.screenshot.url(:thumb), link.screenshot.url(:original) %> 不起作用: <%= link_to image_ta

学习Ruby/Rails,并在ERB模板中遇到了以下问题:

有效

<%= link_to image_tag(link.screenshot.url(:thumb)), link.screenshot.url(:original) %>
<%= link_to image_tag link.screenshot.url(:thumb), link.screenshot.url(:original) %>

不起作用

<%= link_to image_tag(link.screenshot.url(:thumb)), link.screenshot.url(:original) %>
<%= link_to image_tag link.screenshot.url(:thumb), link.screenshot.url(:original) %>

在第一个示例中,
image\u tag
的参数在括号中。另一方面,它们不是

我在Ruby中逐渐了解到,方法并不总是需要括号中的参数,但是在这种情况下跳过它们的约定似乎是有问题的

处理好它?ERB模板的特殊性?还是我错过了更大的东西


一如既往,谢谢。

在决定如何解释省略括号的嵌套函数调用时,ruby不考虑方法签名以及它们允许的参数数量。相反,它只是遵循一组固定的优先规则,在您的情况下,这会导致不同的结果,包括括号和不包括括号:

def a(*arguments)
  puts "a called with #{arguments.inspect}"
  return :a_result
end

def b(*arguments)
  puts "b called with #{arguments.inspect}"
  return :b_result
end

def c(*arguments)
  puts "c called with #{arguments.inspect}"
  return :c_result
end

def d(*arguments)
  puts "d called with #{arguments.inspect}"
  return :d_result
end

puts (a b(c(:foo)), d(:bar)).inspect
# c called with [:foo]
# b called with [:c_result]
# d called with [:bar]
# a called with [:b_result, :d_result]
# :a_result

puts (a b c(:foo), d(:bar) ).inspect
# c called with [:foo]
# d called with [:bar]
# b called with [:c_result, :d_result]
# a called with [:b_result]
# :a_result
因此,使用
b
s参数,调用被等效地解释为

a(b(c(:foo), d(:bar)))

如果其中一个函数不允许这些数量的参数,则该行将失败。更危险的是,当函数确实允许可变数量的参数时,正如我这里的示例函数所做的那样,您将执行一个与您可能想象的不同的操作,并且可能只会在很久以后才注意到错误。

本例中缺少括号表示解析此类表达式的问题。通常,在Ruby中,当“如何传递参数”很清楚时,可以省略它们

让我们考虑下面的情况——我有<代码> Audio/Cuff>和方法定义:

def add(*args)
  args.inject(:+)
end

def multi(*args)
  args.inject(:*)
end
因此,以下几点是明确的:

add 1, 2, 3, 4
# => 10

multi 1, 2, 3, 4
# => 24
但如果:

add 1, multi 2, 3, 4
预期产出是多少?你可以考虑以下几种情况:

add(1, multi(2, 3), 4)
# => 11

add(1, multi(2, 3, 4))
# => 25

add(1, multi(2), 3, 4)
# => 10
当使用括号时-您可以计算输出,因为您知道哪些参数用于哪个方法。如果使用时没有-你不能,所以Ruby也不能这样做

让我们回到你提到的方法。Ruby不知道方法是否:

<%= link_to image_tag link.screenshot.url(:thumb), link.screenshot.url(:original) %>

应被视为:

<%= link_to image_tag(link.screenshot.url(:thumb)), link.screenshot.url(:original) %>

或:


希望能对这个问题有所帮助


祝你好运

请看这里的答案。基本上,当您有多个嵌套方法时(
link\u to
image\u tag
),Rails需要用括号来知道哪些参数与哪些方法相匹配。非常清楚地说明了我的想法,谢谢!