是否可以创建一个PHP函数,通过引用获取所有参数的可变数量的参数?
它没有帮助我通过引用接收一个值数组的函数,也没有一个函数将其参数包含在一个对象中,因为我正在处理函数组合和参数绑定.不要考虑呼叫时间传递参考.那东西甚至不应该存在.
php parameter-passing pass-by-reference variadic-functions function-parameter
我想摆脱这一批......
public void info(String msg);
public void info(String format, Object arg);
public void info(String format, Object arg1, Object arg2);
public void info(String format, Object[] argArray);
Run Code Online (Sandbox Code Playgroud)
......并用这个替换它......
public void info(String format, Object ... args);
Run Code Online (Sandbox Code Playgroud)
...这样我的日志记录语法就不必根据我想记录的参数数量而改变.似乎有很多讨论和解决方法,但它在哪里?或者我应该包装slf4j的包装器?
感谢对这个问题的精彩回答,我理解如何用varargs调用javascript函数.
现在我正在寻找使用构造函数的应用程序
我在这篇文章中找到了一些有趣的信息.
但我的代码是错误的
尝试1:
var mid_parser = new Parser.apply(null, mid_patterns);
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: Function.prototype.apply called on incompatible [object Object]
Run Code Online (Sandbox Code Playgroud)
尝试2:尝试1:
var mid_parser = new Parser.prototype.apply(null, mid_patterns);
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: Function.prototype.apply called on incompatible [object Object]
Run Code Online (Sandbox Code Playgroud)
尝试2:
function Parser()
{
this.comparemanager = new CompareManager(arguments);
}
mid_patterns = [objA,objB,objC]
var mid_parser = new Parser();
Parser.constructor.apply(mid_parser, mid_patterns);
Run Code Online (Sandbox Code Playgroud)
错误:
syntax_model.js:91: SyntaxError: malformed formal parameter
Run Code Online (Sandbox Code Playgroud)
尝试3:
var mid_parser = Parser.apply(null, mid_patterns);
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: this.init is undefined // init is a function …Run Code Online (Sandbox Code Playgroud) 简单的问题,如何使这段代码工作?
public class T {
public static void main(String[] args) throws Exception {
new T().m();
}
public // as mentioned by Bozho
void foo(String... s) {
System.err.println(s[0]);
}
void m() throws Exception {
String[] a = new String[]{"hello", "kitty"};
System.err.println(a.getClass());
Method m = getClass().getMethod("foo", a.getClass());
m.invoke(this, (Object[]) a);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
class [Ljava.lang.String;
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
Run Code Online (Sandbox Code Playgroud) 我正在使用一个提供电子邮件功能的插件,如下所示:
class SendSesMail {
//to
void to(String ... _to) {
this.to?.addAll(_to)
log.debug "Setting 'to' addresses to ${this.to}"
}
}
Run Code Online (Sandbox Code Playgroud)
文档声明该类的调用如下:
sesMail {
from "from@a.com"
replyTo "reply@a.com"
to "t@a.com", "t@b.com", "t@c.com"
subject "Subject"
html "Body HTML"
}
Run Code Online (Sandbox Code Playgroud)
在代码List中建立了一个地址,我试图找出如何将此列表转换为该方法所期望的var args.
转换为String与","连接不起作用,因为这是一个无效的电子邮件地址.我需要能够将每个List项分成一个单独的参数,以避免迭代List并单独发送每封电子邮件.
我有一个关于Java main声明的语法的问题:
public static void main (String[] args)
Run Code Online (Sandbox Code Playgroud)
由于在调用main函数时可以传递可变数量的字符串,这不应该是变量长度参数列表而不是数组吗?为什么使用字符串参数列表对此方法进行命令行调用甚至可以工作?(除非有幕后处理用字符串列表构建数组,然后将该数组传递给main方法......?)主要声明不应该更像这样......? -
public static void main(String... args)
Run Code Online (Sandbox Code Playgroud) 这可能是一个非常简单的解释,但是如果我错了,我会尽可能多地给出背景故事.对于如此冗长而道歉.我正在使用gcc4.5,并且我意识到c ++ 0x支持仍然有点实验性,但我将假设我所看到的行为存在非bug相关的原因.
我正在尝试使用可变参数函数模板.最终目标是建立一个缺点std::pair.它不是一个自定义类型,只是一对配对对象.构造列表的函数必须以某种方式递归,最终返回值取决于递归调用的结果.作为附加扭曲,连续参数在插入列表之前被添加在一起.所以如果我通过[1,2,3,4,5,6],最终结果应该是{1 + 2,{3 + 4,5 + 6}}.
我最初的尝试相当天真.一个函数,Build,有两个重载.一个人拿了两个相同的参数,然后简单地返回它们 另一个采用了两个参数和一个参数包.返回值是一对由两个设置参数和递归调用之和组成.回想起来,这显然是一个有缺陷的策略,因为当我试图找出它的返回类型时,函数没有被声明,所以它别无选择,只能解析为非递归版本.
我明白了 我困惑的地方是第二次迭代.我决定让这些函数成为模板类的静态成员.函数调用本身不是参数化的,而是整个类.我的假设是,当递归函数尝试生成其返回类型时,它将使用自己的静态函数实例化整个新版本的结构,并且所有内容都可以自行运行.
结果是:"错误:没有匹配函数来调用BuildStruct<double, double, char, char>::Go(const char&, const char&)"
违规代码:
static auto Go(const Type& t0, const Type& t1, const Types&... rest)
-> std::pair<Type, decltype(BuildStruct<Types...>::Go(rest...))>
Run Code Online (Sandbox Code Playgroud)
我的困惑来自于这样的事实:参数BuildStruct应始终与发送的参数类型相同BuildStruct::Go,但在错误代码Go中缺少最初的两个双参数.我在这里错过了什么?如果我最初关于如何选择静态函数的假设是不正确的,为什么它试图调用错误的函数而不是根本找不到函数?它似乎只是混合类型,而且我无法想出为什么.如果我在初始调用中添加其他参数,它总是在失败之前向下挖掘到最后一步,因此假设递归本身至少部分工作.这与初始尝试形成鲜明对比,初始尝试始终无法立即找到函数调用.
最终,我已经解决了这个问题,一个相当优雅的解决方案,几乎不像前两次尝试.所以我知道如何做我想做的事.我正在寻找我所看到的失败的解释.
完整的代码,因为我确信我的口头描述不足.首先是一些样板文件,如果您觉得有必要执行代码并亲自查看它.然后是合理失败的初始尝试,然后是第二次尝试,但没有.
#include <iostream>
using std::cout;
using std::endl;
#include <utility>
template<typename T1, typename T2>
std::ostream& operator <<(std::ostream& str, const std::pair<T1, T2>& p) {
return str << "[" << p.first << ", " << p.second << …Run Code Online (Sandbox Code Playgroud) lambda函数是否有可能具有可变数量的参数?例如,我想编写一个元类,它为其他类的每个方法创建一个方法,这个新创建的方法返回原始方法的相反值,并且具有相同数量的参数.我想用lambda函数做到这一点.如何传递参数?可能吗?
class Negate(type):
def __new__(mcs, name, bases, _dict):
extended_dict = _dict.copy()
for (k, v) in _dict.items():
if hasattr(v, '__call__'):
extended_dict["not_" + k] = lambda s, *args, **kw: not v(s, *args, **kw)
return type.__new__(mcs, name, bases, extended_dict)
class P(metaclass=Negate):
def __init__(self, a):
self.a = a
def yes(self):
return True
def maybe(self, you_can_chose):
return you_can_chose
Run Code Online (Sandbox Code Playgroud)
但结果完全错了:
>>>p = P(0)
>>>p.yes()
True
>>>p.not_yes() # should be False
Traceback (most recent call last):
File "<pyshell#150>", line 1, in <module>
p.not_yes()
File "C:\Users\Desktop\p.py", line 51, …Run Code Online (Sandbox Code Playgroud) int max(int n, ...)
Run Code Online (Sandbox Code Playgroud)
我正在使用cdecl调用约定,其中调用者在被调用者返回后清理变量.
我想知道怎么做宏va_end,va_start和va_arg工作?
调用者是否将参数数组的地址作为max的第二个参数传递?
基本上在执行查询之后我想获取结果行并生成一个[]map[string]interface{},但我不知道如何使用API执行此操作,因为该Rows.Scan()函数需要一个特定数量的参数来匹配所请求的列数(可能还有类型)以及)正确获取数据.
同样,我想概括这个调用并接受任何查询并将其转换为a []map[string]interface{},其中map包含映射到该行的值的列名.
这可能非常低效,我计划稍后更改结构,这interface{}是单个数据点的结构.
我如何仅使用database/sql包,或者如果需要使用database/sql/driver包?