相关疑难解决方法(0)

对于Ruby中的块,执行.对比花括号

我有一个同事正在积极地试图说服我不要使用do..end而是使用花括号来定义Ruby中的多行块.

我坚定地只使用花括号作为短单线,并且做其他事情.但我想我会联系更大的社区来获得一些解决方案.

那是哪个,为什么?(一些应该代码的示例)

context do
  setup { do_some_setup() }
  should "do somthing" do
    # some more code...
  end
end
Run Code Online (Sandbox Code Playgroud)

要么

context {
  setup { do_some_setup() }
  should("do somthing") {
    # some more code...
  }
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,只看上面的问题就可以解答我的问题,但我想向更大的社区开放.

ruby coding-style ruby-on-rails ruby-on-rails-3

139
推荐指数
7
解决办法
4万
查看次数

Ruby中这些块编码样式的区别或价值是什么?

哪种款式首选?一个与另一个有充分的理由吗?

提前致谢!

1) cmds.each do |cmd|
   end

2) cmds.each { |cmd|
   }
Run Code Online (Sandbox Code Playgroud)

示例代码:

cmds = [ "create", "update", "list", "help" ]

# Block style one
#
cmds.each do |cmd|
  puts "loop1, cmd: #{cmd}"
end

# Block style two
#
cmds.each { |cmd|
  puts "loop2, cmd: #{cmd}"
}
Run Code Online (Sandbox Code Playgroud)

ruby coding-style

32
推荐指数
4
解决办法
4154
查看次数

Ruby多行块无需结束

我是Ruby的初学者,所以我很遗憾地问这么简单,但是这个代码有什么问题 -

3.upto(9) {
  print "Hello"
  puts " World"
}
Run Code Online (Sandbox Code Playgroud)

要么

3.upto(9) { |n|
  print "Hello "
  puts n
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我看到的大多数代码示例使用的语法

3.upto(9) do |n|
  print "Hello "
  puts n
end
Run Code Online (Sandbox Code Playgroud)

仅仅是对单个语句使用花括号的约定吗?来自C/C#第一个对我来说似乎更自然,但在罗马时!

ruby

20
推荐指数
2
解决办法
1万
查看次数

Ruby do/end vs braces

为什么这个地图表达式会产生不同的结果,具体取决于我是使用大括号还是执行/结束?

a = [1,2,3,4,5]


p a.map { |n|
    n*2
}  
#=> [2,4,6,8,10]


p a.map do |n|
    n*2
end  
#=> [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

ruby block

20
推荐指数
1
解决办法
1万
查看次数

块语法差异导致"LocalJumpError:no block given(yield)"

看到一个奇怪的案例,试图弄清楚这里发生了什么:

> def test
>   p yield
> end
=> nil
> test { 1 }
1
=> 1
> p test { 1 }
1
1
=> 1
> p test do
>   1
> end
LocalJumpError: no block given (yield)
Run Code Online (Sandbox Code Playgroud)

ruby block

15
推荐指数
2
解决办法
2万
查看次数

Ruby块和不带括号的参数

我提取了简单的例子:

require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }

pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })
Run Code Online (Sandbox Code Playgroud)

我想知道为什么第一个pp产生:

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

所有的演讲者都在给予:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]
Run Code Online (Sandbox Code Playgroud)

我认为它与运算符优先级有关.我在哪里可以找到好的解释?

ruby parentheses

9
推荐指数
1
解决办法
1828
查看次数

块定义 - 大括号和do-end之间的区别?

任何人都可以解释为什么以下代码中止错误

irb(main):186:0> print ((1..10).collect do |x| x**2 end)
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block,
expecting ')'
print ((1..10).collect do |x| x**2 end)
                         ^
(irb):186: syntax error, unexpected keyword_end, expecting $end
print ((1..10).collect do |x| x**2 end)
                                      ^
        from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

而具有相同功能的以下代码是否按预期工作?

irb(main):187:0> print ((1..10).collect { |x| x**2 })
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil
Run Code Online (Sandbox Code Playgroud)

我确实认为花括号"{}"可以在块定义中任意替换"do end".

我知道我可以通过省略print方法和第一个括号之间的空格来"修复"第一个调用,但我对解释它为什么表现不同感兴趣 .

ruby block

9
推荐指数
1
解决办法
2167
查看次数

Ruby块语法错误

可能重复:
Ruby块和未加括号的参数

我不确定我是否理解这种语法错误.我正在使用Carrierwave来管理Rails应用程序中的一些文件上传,我似乎错误地将一个块传递给其中一个方法.

以下是Carrierwave文档中的示例:

version :thumb do
  process :resize_to_fill => [200,200]
end
Run Code Online (Sandbox Code Playgroud)

这就是我的所作所为:

version :full   { process(:resize_to_limit => [960, 960]) }
version :half   { process(:resize_to_limit => [470, 470]) }
version :third  { process(:resize_to_limit => [306, 306]) }
version :fourth { process(:resize_to_limit => [176, 176]) }
Run Code Online (Sandbox Code Playgroud)

我得到以上不起作用syntax error, unexpected '}', expecting keyword_end.有趣的是,以下工作完美:

version :full   do process :resize_to_limit => [960, 960]; end
version :half   do process :resize_to_limit => [470, 470]; end
version :third  do process :resize_to_limit => [306, …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails block syntax-error carrierwave

9
推荐指数
1
解决办法
1289
查看次数

为什么不做/ end和{}总是等价?

可能重复:
Ruby块和不带括号的参数Ruby
中这些块编码样式的区别或价值是什么?

我一直认为以下只是两种说法相同的方式:

[1,2,3].collect{|i| i * 2}

[1,2,3].collect do |i|
  i * 2
end
Run Code Online (Sandbox Code Playgroud)

但是我在我的一个ERB模板中得到了一些奇怪的行为,其中两个语法似乎做了两件不同的事情.这段代码效果很好:

<%=raw @menu.collect { |m| 
    content_tag("li") {
        link_to(m.capitalize, url_for(:controller => m))
    } 
} %>
Run Code Online (Sandbox Code Playgroud)

但当我重写它时:

<%=raw @menu.collect do |m| 
    content_tag("li") do
        link_to(m.capitalize, url_for(:controller => m))
    end 
end %>
Run Code Online (Sandbox Code Playgroud)

...我最终得到了一串连结的@menu项目.我错过了什么吗?这里有一些细小的语法糖吗?

ruby ruby-on-rails

6
推荐指数
1
解决办法
869
查看次数

在表达式上调用'puts'来改变它的解释方式?

我刚遇到一个问题,函数返回的值是不同的,这取决于我是否调用puts对该结果.我想知道这是否是预期的,或某种解析器错误.

仅当传递给函数的块使用do...end语法而不是内联{...}语法时才会出现这种情况.这是一个例子:

arr = ["a", "b", "c"]
puts i = arr.index { |x| == "b" }
#=> 1
Run Code Online (Sandbox Code Playgroud)

正如所料,但这并不像我预期的那样有效:

arr = ["a", "b", "c"]
puts i = arr.index do |x|
  x == "b"
end
#=> #<Enumerator:0xSomeId>
Run Code Online (Sandbox Code Playgroud)

虽然如果我这样做它可以正常工作:

arr = ["a", "b", "c"]
i = arr.index do |x|
  x == "b"
end
puts i
#=> 1
Run Code Online (Sandbox Code Playgroud)

看起来它被解释为好像没有传递任何块(返回枚举器是arr.index使用块调用的预期行为).这是正常的吗?这种行为是在任何地方解释/记录的

ruby

4
推荐指数
1
解决办法
90
查看次数