我有一个可变长度数组,我需要将其转换为函数的参数列表.
我希望有一个巧妙的方法 - 但我看不出如何.
我正在编写的代码将调用类中的方法 - 但我不知道方法的名称,也不知道它有多少参数.
我试过这个 - 但它不起作用:
$params = array(1 => "test", 2 => "test2", 3 => "test3");
ClassName::$func_name(implode($params, ","));
Run Code Online (Sandbox Code Playgroud)
以上将所有值都归为函数的第一个参数.而它应该使用3个参数值(test,test2,test3)调用该函数.
我需要的是这个:
ClassName::$func_name("test", "test2", "test3");
Run Code Online (Sandbox Code Playgroud)
任何想法如何做到这一点整洁?
我试图在我的Rails日志中获取更多信息,特别是请求的URI或当前参数(如果可用)(我感谢他们并不总是这样).但是我似乎无法做到.这是我到目前为止所做的:
#config/environments/production.rb
config.logger = Logger.new(config.log_path)
config.log_level = :error
config.logger.level = Logger::ERROR
#config/environment.rb
class Logger
def format_message(level, time, progname, msg)
"**********************************************************************\n#{level} #{time.to_s(:db)} -- #{msg}\n"
end
end
Run Code Online (Sandbox Code Playgroud)
所以我可以自定义消息,但我似乎无法在这里访问params/request变量.有谁知道这是否可能,如果是这样的话怎么样?或者,如果有更好的方法来获取此信息?(甚至可能是Redis的基础?)
谢谢你,
担
我想传递参数(哈希)redirect_to,如何做到这一点?例如:
hash = { :parm1 => "hi", :parm2 => "hi" }
Run Code Online (Sandbox Code Playgroud)
我想重定向到页面 /hello
这样的网址: /hello?parm1=hi&parm2=hi
我必须在不确定的URL中添加一个新的参数param=value.
如果实际的URL已经像这样params
http://url.com?p1=v1&p2=v2
Run Code Online (Sandbox Code Playgroud)
我应该将URL转换为另一个:
http://url.com?p1=v1&p2=v2¶m=value
Run Code Online (Sandbox Code Playgroud)
但是如果URL没有任何参数,那么:
http://url.com
Run Code Online (Sandbox Code Playgroud)
我应该将URL转换为另一个:
http://url.com?param=value
Run Code Online (Sandbox Code Playgroud)
我觉得用Regex解决这个问题很担心,因为我不确定寻找存在&就足够了.我想也许我应该将URL转换为URI对象,然后添加param并再次将其转换为String.
寻找已经处于这种情况的人的任何建议.
为了帮助参与,我正在共享一个基本的测试套件:
require "minitest"
require "minitest/autorun"
def add_param(url, param_name, param_value)
# the code here
"not implemented"
end
class AddParamTest < Minitest::Test
def test_add_param
assert_equal("http://url.com?param=value", add_param("http://url.com", "param", "value"))
assert_equal("http://url.com?p1=v1&p2=v2¶m=value", add_param("http://url.com?p1=v1&p2=v2", "param", "value"))
assert_equal("http://url.com?param=value#&tro&lo&lo", add_param("http://url.com#&tro&lo&lo", "param", "value"))
assert_equal("http://url.com?p1=v1&p2=v2¶m=value#&tro&lo&lo", add_param("http://url.com?p1=v1&p2=v2#&tro&lo&lo", "param", "value"))
end
end
Run Code Online (Sandbox Code Playgroud) 与此问题类似,我想将可选参数与params关键字混合,这当然会产生歧义.不幸的是,创建重载的答案不起作用,因为我想利用调用者信息属性,如下所示:
public void Info(string message, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0, params object[] args)
{
_log.Info(BuildMessage(message, memberName, lineNumber), args);
}
Run Code Online (Sandbox Code Playgroud)
在没有可选参数的情况下创建重载会更改调用站点,从而阻止这些特定参数正常工作.
我找到了一个几乎可以工作的解决方案(虽然很难看):
public void Info(string message, object arg0, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0);
}
public void Info(string message, object arg0, object arg1, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0, arg1);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果为最后一个参数指定一个字符串,则重载决策假定您打算memberName在重载中显式指定需要较少的参数,这不是所需的行为.
有没有办法实现这一点(也许使用一些我没有学过的新属性?)或者我们是否只是达到了自动魔法编译器支持可以给我们的极限?
是否可以使用C#lambda/delegate来获取可以使用Dynamic-invoke调用的可变数量的参数?
我在这种情况下使用'params'关键字的所有尝试都失败了.
来自答案的工作代码更新:
delegate void Foo(params string[] strings);
static void Main(string[] args)
{
Foo x = strings =>
{
foreach(string s in strings)
Console.WriteLine(s);
};
//Added to make it clear how this eventually is used :)
Delegate d = x;
d.DynamicInvoke(new[]{new string[]{"1", "2", "3"}});
}
Run Code Online (Sandbox Code Playgroud) 我喜欢Rail的map.resources生成的所有默认路由.但是,有些情况下我想在我的路线中使用非数字标识符.例如,如果嵌套路由由用户及其文章组成,则可以按如下方式编写标准路由:
map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'
Run Code Online (Sandbox Code Playgroud)
但是,有许多优点/原因不使用Rails生成的默认数字标识符.有没有办法将default:id params替换为我选择的另一个规范标识符,而不会为每个标准操作编写自定义路由?如果我想要一个以下格式的路线:
'/users/:login/articles/:id'
Run Code Online (Sandbox Code Playgroud)
这种路线是否可以使用map.resources实现?
我想知道是否有任何类似的东西可以用于价值类型......
public static class ExtensionMethods {
public static void SetTo(this Boolean source, params Boolean[] bools) {
for (int i = 0; i < bools.Length; i++) {
bools[i] = source;
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么这是可能的:
Boolean a = true, b, c = true, d = true, e;
b.SetTo(a, c, d, e);
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为bools是一个值类型,因此它们作为值传递给函数,而不是作为引用.
除了将值类型包装到引用类型中(通过创建另一个类),有没有办法在使用params修饰符时通过引用(ref)将变量传递给函数?
我一直在使用Yii一段时间,当我想从数据库中提取数据时,我通常只使用findByAttributes.
$model=Auction::model()->findAllByAttributes(array('status'=>'1'));
Run Code Online (Sandbox Code Playgroud)
或类似的规定.
我的问题是,我将如何处理大于类型的情况?我试过了
$model=Auction::model()->findAllByAttributes(array('starttime'>=$date));
Run Code Online (Sandbox Code Playgroud)
其中日期已分配当前日期/时间设置,但这会导致错误.所以我的问题是我需要使用条件和/或参数吗?我应该在模型中使用Criteria或CActiveDataProvider这样的东西吗?
我希望有人指出我正确的方向.我总是通过使用findAll()来获得,但我知道他们是更好的方法.关于什么以及何时使用属性,条件,参数等的一般信息也很好.
我已阅读Yii文档并搜索了大量网站以获取这些问题的答案,我找不到它.
Rails 4添加了一个异常ActionDispatch :: ParamsParser :: ParseError异常,但由于它在中间件堆栈中,它似乎无法在普通控制器环境中获救.在json API应用程序中,我想用标准错误格式进行响应.
这个要点显示了插入中间件以拦截和响应的策略.遵循这种模式我有:
application.rb中:
module Traphos
class Application < Rails::Application
....
config.middleware.insert_before ActionDispatch::ParamsParser, "JSONParseError"
end
end
Run Code Online (Sandbox Code Playgroud)
中间件是:
class JSONParseError
def initialize(app)
@app = app
end
def call(env)
begin
@app.call(env)
rescue ActionDispatch::ParamsParser::ParseError => e
[422, {}, ['Parse Error']]
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果我在没有中间件的情况下运行测试,我会得到(spec):
Failures:
1) Photo update attributes with non-parseable json
Failure/Error: patch update_url, {:description => description}, "CONTENT_TYPE" => content_type, "HTTP_ACCEPT" => accepts, "HTTP_AUTHORIZATION" => @auth
ActionDispatch::ParamsParser::ParseError:
399: unexpected token at 'description=Test+New+Description]'
Run Code Online (Sandbox Code Playgroud)
这正是我所期望的(ParseError,我无法rescue_from). …