相关疑难解决方法(0)

使用do block vs braces {}

新的红宝石,穿上你的新手套.

以下两个片段之间是否有任何区别(模糊或实用)?

my_array = [:uno, :dos, :tres]
my_array.each { |item| 
    puts item
}

my_array = [:uno, :dos, :tres]
my_array.each do |item| 
    puts item
end
Run Code Online (Sandbox Code Playgroud)

我意识到括号语法允许你将块放在一行上

my_array.each { |item| puts item }
Run Code Online (Sandbox Code Playgroud)

但除此之外是否有任何令人信服的理由使用一种语法而不是另一种语法?

ruby coding-style

111
推荐指数
4
解决办法
6万
查看次数

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万
查看次数

块定义 - 大括号和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
查看次数

如何将两个不同散列数组的值一起添加?

我有两个哈希数组.哈希的键是不同的:

player_scores1 = [{:first_name=>"Bruce", :score => 43, :time => 50},
                  {:first_name=>"Clark", :score => 45, :minutes => 20}]

player_scores2 = [{:last_name=>"Wayne", :points => 13, :time => 40},
                  {:last_name=>"Kent", :points => 3, :minutes => 20}]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的哈希数组,它们加起来:得分和:一起指向并将其分配给一个名为:score的键.我还想组合:first_name和:last_name并将其分配给名为:full_name的键.我想丢弃任何其他钥匙.

这将导致这个数组:

all_players = [{:full_name => "Bruce Wayne", :score => 56}, 
               {:full_name => "Clark Kent", :score => 48}]
Run Code Online (Sandbox Code Playgroud)

有一种优雅的方式来做到这一点?

ruby arrays hash

3
推荐指数
1
解决办法
395
查看次数

传递给每个代码块的代码块使用括号而不是'do' - 'end'(ruby)

我最近开始学习ruby,我知道你可以使用这两种语法的代码块.但我刚发现一个我不明白的案例:

#my_hash is a hash in which the keys are strings and the values arrays, but dont think about the specifics fo the code

#if I run my code like this, it works perfectly

my_hash.each do |art|
  puts mystring.gsub(art[0]).each {
    art[1][rand(art[1].length) -1]
  }
end

#but if I use this, it prints "Enumerator"

my_hash.each do |art|
  puts mystring.gsub(art[0]).each do
    art[1][rand(art[1].length) -1]
  end
end
Run Code Online (Sandbox Code Playgroud)

是因为你不能窝对端对吗?我使用的是1.9

ruby

3
推荐指数
1
解决办法
1270
查看次数

为什么在分配变量时,do/end块的行为/返回方式不同?

puts [1,2,3].map do |x| 
  x + 1 
end.inspect
Run Code Online (Sandbox Code Playgroud)

随着ruby 1.9.2的回归

<Enumerator:0x0000010086be50>
Run Code Online (Sandbox Code Playgroud)

红宝石1.8.7:

# 1
# 2
# 3
Run Code Online (Sandbox Code Playgroud)

分配变量......

x = [1,2,3].map do |x| 
  x + 1 
end.inspect

puts x
Run Code Online (Sandbox Code Playgroud)

[2,3,4]

小胡子块按预期工作:

puts [1,2,3].map { |x| x + 1 }.inspect
Run Code Online (Sandbox Code Playgroud)

[2,3,4]

ruby

3
推荐指数
1
解决办法
297
查看次数

Instance_eval不适用于do/end块,仅适用于{} -blocks

如果我有课:

class KlassWithSecret
  def initialize
    @secret = 99
  end
end
Run Code Online (Sandbox Code Playgroud)

并运行:

puts KlassWithSecret.new.instance_eval { @secret }
Run Code Online (Sandbox Code Playgroud)

它打印99,但如果我运行:

puts KlassWithSecret.new.instance_eval do
  @secret
end
Run Code Online (Sandbox Code Playgroud)

它返回一个错误: `instance_eval': wrong number of arguments (0 for 1..3) (ArgumentError)

为什么我不能使用do/end块instance_eval?

PS我正在使用Ruby 2.1.0.

ruby instance-eval

3
推荐指数
1
解决办法
419
查看次数

将块传递给方法 - Ruby

我对传球有一点疑问.

def a_method(a, b)
  a + yield(a, b)
end
Run Code Online (Sandbox Code Playgroud)

这很好用.

k = a_method(1, 2) do |x, y| 
  (x + y) * 3 
end
puts k
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

puts a_method(1, 2) do |x, y| 
  (x + y) * 3 
end
# LocalJumpError: no block given (yield)
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个吗?

谢谢.Paolo Perrotta从Metaprogramming Ruby中获取的示例.好书.

ruby block

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

在红宝石中,什么时候是一块不是一块?

抛开笑话,我有一个奇怪的情况,我有一些代码:

def remotes(form,remotes)
  personalised_form = form.dup
  remotes.each do |ident,remote|
    object = yield(ident)
    result = remote.call(object)
    insert_into_(personalised_form,ident,result)
  end
  personalised_form
end
Run Code Online (Sandbox Code Playgroud)

而且我看到它是否如此工作:

pp remotes(forms,remotes) do |ident|
  case(ident)
    when :get_assets
      '@Userobject'
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,ruby似乎认为我没有将一个块传递给该remotes函数.

为什么红宝石坚持认为我没有通过一个街区?(它no block given (yield) (LocalJumpError)具体给出了).

认为它不相关,遥控器是包含键和Proc的散列,而形式只是一个特定结构的散列,其中使用ident插入proc的结果来定位正确的插入点

ruby block proc

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