新的红宝石,穿上你的新手套.
以下两个片段之间是否有任何区别(模糊或实用)?
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 中编写块有两种不同的语法。有
do |something|
...
end
Run Code Online (Sandbox Code Playgroud)
还有
{ |something|
...
}
Run Code Online (Sandbox Code Playgroud)
我意识到这只是用括号替换关键字“do”和“end”。这让我想知道,当 Ruby 使用这两种语法时,处理它们的方式是否有任何显着差异。或者 Ruby 是否以相同的方式处理它们,可以互换?如果它们完全可以互换,那么为什么要同时包含两者呢?
如果讨论或非常明显,请随意删除此主题.我来自C#背景,我打算学习Ruby.我读到的所有内容似乎都很有趣.但我对Ruby的这个基本哲学感到困惑,"有一种方法可以做一件事".有人可以提供2或3个简单的算术或字符串示例来明确这一点,例如它的语法或逻辑等.
谢谢
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 中样式和缩进的一般建议是什么?例如
collection :available_surveys,
exec_context: :decorator,
class: Survey,
skip_render: lambda {|object, opts| opts[:show_all_surveys] != true } do
property :name, as: :survey_name
property :id
end
Run Code Online (Sandbox Code Playgroud)
该方法是集合,它有 4 个参数分布在多行中,然后是一个块参数。我的一位同事觉得上面的缩进样式使块看起来像是绑定到最后一个参数,而不是集合方法。我在互联网上找不到任何明确的风格建议。
为什么:
test = [1, 1, 1].collect do |te|
te + 10
end
puts test
Run Code Online (Sandbox Code Playgroud)
有效,但不是:
puts test = [1, 1, 1].collect do |te|
te + 10
end
Run Code Online (Sandbox Code Playgroud)
然而这有效:
puts test = [1, 1, 1].collect { |te|
te + 10
}
Run Code Online (Sandbox Code Playgroud)
对于我不知道的块,do/end构造和{}构造之间是否存在差异?
{ |n| "user#{n}" }
Run Code Online (Sandbox Code Playgroud)
带两根管子的花括号.这是一个荒谬的问题,我知道,但试图谷歌这个语法的名称已被证明是不可能的.
我正在使用这个宝石.当我使用以下语法时,它工作正常:
every :day do
rake 'billing:daily'
end
Run Code Online (Sandbox Code Playgroud)
但是,当我使用以下语法时,gem给出了语法错误:
every :day { rake 'billing:daily' }
Run Code Online (Sandbox Code Playgroud)
输出:
~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/job_list.rb:25:in `instance_eval': config/schedule.rb:26: syntax error, unexpected '{', expecting end-of-input (SyntaxError)
every :day { rake 'billing:daily' }
^
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/job_list.rb:25:in `initialize'
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever.rb:12:in `new'
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever.rb:12:in `cron'
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/command_line.rb:42:in `run'
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/command_line.rb:6:in `execute'
from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/bin/whenever:44:in `<top (required)>'
from ~/.rbenv/versions/2.4.3/bin/whenever:23:in `load'
from ~/.rbenv/versions/2.4.3/bin/whenever:23:in `<main>'
Run Code Online (Sandbox Code Playgroud)
两个都不是一回事吗?为什么前者工作但后者不工作?
class Lod
attr_accessor :lodnr
attr_accessor :lobnr
attr_accessor :stknr
def initialize(lodnr, lobnr, stknr)
@lodnr = lodnr
@lobnr = lobnr
@stknr = stknr.chomp
end
def to_s
"%8s, %5s, %3s" % [@lodnr, @lobnr, @stknr]
end
end
Run Code Online (Sandbox Code Playgroud)
我有一个sold包含这四个数组的数组:
[10000, 150, 5]
[500, 10, 1]
[8000, 171, 3]
[45, 92, 4]
Run Code Online (Sandbox Code Playgroud)
这四个数组是从.txt文件导入的类的对象.
input = File.open("lodsedler.txt", "r")
input.each do |line|
l = line.split(',')
if l[0].to_i.between?(0, 99999) && l[1].to_i.between?(1, 180) && l[2].to_i.between?(1, 10)
sold << Lod.new(l[0], l[1], l[2])
else
next
end
end
Run Code Online (Sandbox Code Playgroud)
我想计算每个数组中的第一个值,查找存储在其中的随机选择的数字first. …