我的Sinatra应用程序中有这个过滤器:
before '/:locale/*' do
# stuff...
request.path_info = params[:splat]
end
换句话说,我只想获取URL的区域设置部分,然后让应用程序继续运行,就好像它不在那里一样。(当然,在呈现视图时使用区域设置。)
这在Ruby1.8.7中工作得很好,但在>=1.9上就不行了,因为splat现在是一个只有一项的数组,而不仅仅是一个字符串。我必须使用params[:splat].first才能让它工作。
我的问题很简单,这种差异是从哪里来的。这是简单的Ruby1.8v
我正在使用Ruby on Rails 3,我想知道在函数参数附近出现*运算符是什么意思,并想了解它在其他场景中的用法。
示例场景(此方法来自Ruby on Rails 3框架):
def find(*args)
return to_a.find { |*block_args| yield(*block_args) } if block_given?
options = args.extract_options!
if options.present?
apply_finder_options(options).find(*args)
else
case ar
我有一个Ruby Sinatra应用程序和一些代码,除了少数例外,我需要在所有路径上执行这些代码。我该怎么做呢?
如果我想在选定的路由(白名单样式)上执行代码,我会这样做:
['/join', "/join/*", "/payment/*"].each do |path|
before path do
#some code
end
end
我该如何反其道而行之(黑名单风格)?我希望匹配除'/join'、'/join/*'和'/payment/*'之外的所有路由
我有下面的ruby脚本ruby_test.rb in eclipse (DLTK/RUBY),它会引发编译错误,并且无法在eclipse中运行。这是有意义的,因为*arr应该是最后一个参数。但是当我在命令行(ruby ruby_test.rb)上运行它时,它运行得很好。知道为什么吗?
我安装的红宝石版本是2.1.6p336
#!/usr/bin/ruby
arr = [1,2,3]
def test(a1,a2,a3,a4,a5)
puts "The first number is #{a1}"
puts "The second number is #
我试图发送带有Powershell脚本的电子邮件,当我运行我的程序时,我得到了如下所示的错误:
Exception setting "Add": "Cannot set the Value property for PSMemberInfo object of type
"System.Management.Automation.PSMethod"."
At C:\Users\documents\eventSender.ps1:11 char:1
+ $emailMessageObject.To.Add = $toEmailAddress
+
这是我的节目:
def calculate(*numbers, options = {})
add(numbers) if options[:add]
subtract(numbers) if options[:add] == false
end
def add(*numbers)
numbers.reduce(:+)
end
def subtract(*numbers)
numbers.reduce(:-)
end
p calculate(1,2)
在第1行,它是在抱怨
tests.rb:1:语法错误,意外的'=',期待')‘
def
在JavaScript ES6中,我们可以创建变量名成为键的对象,如下所示:
> let a = 'aaa'
'aaa'
> let b = 'bbb'
'bbb'
> { a, b }
{ a:"aaa", b:"bbb" }
Ruby有类似于散列的东西吗?
澄清:很明显,这个问题涉及速记法。我在找{a,b}而不是{a:a,b:b}。
假设我有一个数组。我希望将数组传递给一个函数。但是,该函数需要两个参数。有没有办法动态地将数组转换成2个参数?例如:
a = [0,1,2,3,4]
b = [2,3]
a.slice(b)
会在Ruby中产生错误。我需要输入a.slice(b[0],b[1])我正在寻找更优雅的东西,如在a.slice(foo.bar(b))谢谢。
摘录Ruby编程语言:
module Functional
def compose(f)
if self.respond_to?(:arity) && self.arity == 1
lambda {|*args| self[f[*args]] }
else
lambda {|*args| self[*f[*args]] }
end
end
alias * compose
end
class Proc; include Functional; end
class Method; include Functional;
给定Ruby代码
line = "first_name=mickey;last_name=mouse;country=usa"
record = Hash[*line.split(/=|;/)]
除了*操作符之外,我理解第二行中的所有内容-它在做什么,它的文档在哪里?(正如您可能猜到的那样,搜索此案例被证明是困难的……)
这在Ruby中是可能的:
class SomeClass
def initialize(a, *b, c)
end
end
但这并不是:
class SomeClass
def initialize(a, *b, c='anything here')
end
end
为什么?
编辑:这个问题没有答案。在链接的答案中,第一个答案是:
splat的意思是“耗尽所有剩余的参数”,但随后您提供了一个可选的参数,那么解释器如何知道最后一个参数是"numbers“splat还是可选的”选项“的一部分?
这不是一个有效的答案,因为根据这个逻辑,Ruby也不允许
我正在进行从Ruby 2.7到3.0的升级,遇到了关键字参数更改的问题。 以前,我们在代码中出于某些目的使用了define_method。然而,随着关键字参数的改变,它不再能够正确地处理参数数组。 class Foo
def test(a: 1, b: 2)
puts a
puts b
end
old_method = instance_method(:test)
define_method(:test) do |*args, &block|
old_method.bind(self).call(*args, &block)
e