延续“隐藏的特性...”模式,让我们分享Ruby编程语言中不太为人知但有用的特性。
尝试限制此讨论只涉及核心Ruby,没有任何Ruby on Rails的东西。
另请参见:
(请每个答案仅回答一个隐藏特性。)
谢谢
延续“隐藏的特性...”模式,让我们分享Ruby编程语言中不太为人知但有用的特性。
尝试限制此讨论只涉及核心Ruby,没有任何Ruby on Rails的东西。
另请参见:
(请每个答案仅回答一个隐藏特性。)
谢谢
myarray = ["la", "li", "lu"]
myarray.each_with_index{|v,idx| puts "#{idx} -> #{v}"}
#result:
#0 -> la
#1 -> li
#2 -> lu
也许相对于其他答案来说更为人所知,但并不是所有 Ruby 程序员都熟知 :)
Enumerator
都拥有#with_index
方法,也就是说可以使用myarray.each.with_index
或者myarray.map.with_index
这样的语法。 - Reactormonkclass A
private
def my_private_method
puts 'private method called'
end
end
a = A.new
a.my_private_method # Raises exception saying private method was called
a.send :my_private_method # Calls my_private_method and prints private method called'
send_public
。但是似乎没有私有方法或受保护方法的等效方法... - @rogerdpack - Andrew Grimm#!/usr/bin/env ruby
def rprod(k, rv, current, *nums)
puts "#{rv} * #{current}"
k.call(0) if current == 0 || rv == 0
nums.empty? ? (rv * current) : rprod(k, rv * current, *nums)
end
def prod(first, *rest)
callcc { |k| rprod(k, first, *rest) }
end
puts "Seq 1: #{prod(1, 2, 3, 4, 5, 6)}"
puts ""
puts "Seq 2: #{prod(1, 2, 0, 3, 4, 5, 6)}"
你可以在这里看到输出:
对于一个更复杂的示例,其中包含在堆栈上向另一个方向移动的 continuations,请阅读 Generator 的源代码。
我刚刚阅读了所有的答案...有一个值得注意的遗漏是解构赋值:
> (a,b),c = [[1,2],3]
=> [[1,2],3]
> a
=> 1
它还适用于块参数。当您拥有嵌套的数组并且每个元素代表不同的东西时,这将非常有用。您可以将该嵌套数组分解,并为每个元素赋予一个描述性名称,而不是编写类似“array[0][1]”的代码,这可以在一行代码中完成。
@user #=> nil (but I did't know)
@user.name rescue "Unknown"
我最喜欢的Ruby功能。语法是format_string % argument
"%04d" % 1 # => "0001"
"%0.2f" % Math::PI # => "3.14"
对于数组同样适用 (format_string % array_of_arguments
)
"%.2f %.3f %.4f" % ([Math::PI]*3)
# => "3.14 3.142 3.1416"