假设有可能,如何在不在PHP中生成警告的情况下通过引用可变参数函数来传递参数?我们不能再在函数调用中使用'&'运算符,否则我会接受(即使它很容易出错,如果编码器忘了它).
启发这一点的是我发掘的旧MySQLi包装类(现在,我只使用PDO).包装器和MySQLi类之间的唯一区别是包装器抛出异常而不是返回FALSE.
class DBException extends RuntimeException {}
...
class MySQLi_throwing extends mysqli {
...
function prepare($query) {
$stmt = parent::prepare($query);
if (!$stmt) {
throw new DBException($this->error, $this->errno);
}
return new MySQLi_stmt_throwing($this, $query, $stmt);
}
}
// I don't remember why I switched from extension to composition, but
// it shouldn't matter for this question.
class MySQLi_stmt_throwing /* extends MySQLi_stmt */ {
protected $_link, $_query, $_delegate;
public function __construct($link, $query, $prepared) {
//parent::__construct($link, $query);
$this->_link = $link;
$this->_query = …Run Code Online (Sandbox Code Playgroud) 正当我认为我理解JLS15.12应用于varargs时,这是这个例子:
package com.example.test.reflect;
public class MethodResolutionTest2 {
public int compute(Object obj1, Object obj2) {
return 42;
}
public int compute(String s, Object... objects)
{
return 43;
}
public static void main(String[] args) {
MethodResolutionTest2 mrt2 = new MethodResolutionTest2();
System.out.println(mrt2.compute("hi", mrt2));
System.out.println(mrt2.compute("hi", new Object[]{mrt2}));
System.out.println(mrt2.compute("hi", new Object[]{mrt2, mrt2, mrt2}));
}
}
Run Code Online (Sandbox Code Playgroud)
打印出来的
42
43
43
Run Code Online (Sandbox Code Playgroud)
我理解第一行:JLS15.12表示方法解决是分阶段进行的,而第1阶段和第2阶段忽略了varargs方法,以确定是否存在兼容方法,仅当阶段1和阶段2失败时才会发生阶段3(包括变量).(参见JLS和这个问题.)compute(String s, Object... objects)如果compute(Object obj1, Object obj2)适用,总是被忽略.
但我不明白为什么43为其他两行打印.An Object[]也是一个实例Object,为什么它与varargs方法匹配?
编辑:
...还有这个
Object arg2 …Run Code Online (Sandbox Code Playgroud) L1下面的对象有效.我可以L1通过传入varargs 来"创建" ,这很好,但我希望能够L1使用相同的语法分配给一个.不幸的是,我在这里完成它的方式需要更粗略的嵌套Array内部语法L1.
object L1 {
def apply(stuff: String*) = stuff.mkString(",")
def unapply(s: String) = Some(s.split(","))
}
val x1 = L1("1", "2", "3")
val L1(Array(a, b, c)) = x1
println("a=%s, b=%s, c=%s".format(a,b,c))
Run Code Online (Sandbox Code Playgroud)
我尝试以一种显而易见的方式实现这一目标,L2如下所示:
object L2 {
def apply(stuff: String*) = stuff.mkString(",")
def unapply(s: String) = Some(s.split(","):_*)
}
val x2 = L2("4", "5", "6")
val L2(d,e,f) = x2
println("d=%s, e=%s, f=%s".format(d,e,f))
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误:
error: no `: _*' annotation allowed here
(such …Run Code Online (Sandbox Code Playgroud) 我们今天有一些代码接受NSArray并将其作为参数列表传递给 - [NSString initWithFormat:arguments],我们试图让它与ARC一起工作.这是代码使用的
NSString* format = @"Item %s and Item %s"; // Retrieved elsewhere
NSArray* args = [NSArray arrayWithObjects:@"1", @"2", nil]; // Retrieved elsewhere
// http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
char* argsList = (char*) malloc(sizeof(NSString*) * args.count);
[args getObjects:(id*) argsList];
NSString* message = [[[NSString alloc] initWithFormat:format arguments:argsList] autorelease];
free(argsList);
Run Code Online (Sandbox Code Playgroud)
有关如何使ARC符合要求的任何建议?或者我们甚至愿意接受更好的方式.
我有一个函数,试图将东西记录到控制台和日志文件,但它不起作用.第二次使用变长参数会将垃圾写入控制台.有任何想法吗?
void logPrintf(const char *fmt, ...) {
va_list ap; // log to logfile
va_start(ap, fmt);
logOpen;
vfprintf(flog, fmt, ap);
logClose;
va_end(ap);
va_list ap2; // log to console
va_start(ap2, fmt);
printf(fmt, ap2);
va_end(ap2);
}
Run Code Online (Sandbox Code Playgroud) 在我的代码中,当类型是数组时,在实现泛型方法时使用varargs似乎很方便:
public interface Codec<D,E> {
E encode(D decoded);
D decode(E encoded);
}
public class MyCodec implements Codec<byte[], char[]> {
@Override char[] encode(byte... decoded) {...}
@Override byte[] decode(char... encoded) {...}
}
Run Code Online (Sandbox Code Playgroud)
当我写这篇文章时,Eclipse会显示一条警告:
与MyCodec.encode(byte ...)和Codec.encode(byte [])不同,Varargs方法只应覆盖或覆盖其他varargs方法
我应该忽略这个警告,还是会导致一些无法预料的问题?
我正在尝试编写一个函数,它接受各种字符串或数字(与std::to_string它们一起使用并连接它们.我只使用它来处理字符串,但是我在根据输入作为字符串或数字进行特殊处理时遇到了麻烦.
我的代码被调用如下:
stringer("hello", "world", 2, 15, 0.2014, "goodbye", "world")
这就是我所拥有的:
inline std::string stringer(const std::string &string)
{
return string;
}
template <typename T, typename... Args>
inline std::string stringer(const std::string &string, T &&val, Args &&...args)
{
return stringer(string+std::to_string(val), std::forward<Args>(args)...);
}
template <typename... Args>
inline std::string stringer(const std::string &string, Args &&...args)
{
return stringer(string, std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
目前它正在打破任何多个字符串添加,除非以下是所有数字(由于to_string).如何根据字符串或数字进行专门化以完成上述工作?谢谢.
我有一个大致如此的功能:
typedef struct SomeType {
...
} SomeType;
void TakesArgs(SomeType *t1, ...) {
// iterates through arguments
}
// usage:
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)
如果我要更改TakesArgs为无操作,同时仍保持所有调用代码不变,我是否会使用内存(或其他方式)运行任何奇怪的风险?
void TakesArgs(SomeType *t1, ...) {
return;
}
// usage unchanged:
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)
换句话说,跳过在原始实现中执行的va_list/ va_startdance会有任何奇怪的副作用吗?
我希望能够在父类中声明一个具有未知数量参数的抽象函数:
abstract function doStuff(...);
Run Code Online (Sandbox Code Playgroud)
然后使用一组提示参数定义一个实现:
/**
* @param int $userID
* @param int $serviceproviderID
*/
static function doStuff($userID, $serviceproviderID) {}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我得到的最佳方法是,
abstract function doStuff();
/**
* @param int $userID
* @param int $serviceproviderID
*/
static function doStuff() {
$args = func_get_args();
...
}
Run Code Online (Sandbox Code Playgroud)
但每次调用函数时,由于提示,我都会收到一堆"缺少参数"的警告.有没有更好的办法?
编辑:问题是错的,请不要浪费你的时间回答.以下是我正在寻找的东西,似乎没有任何警告.
abstract class Parent {
abstract function doStuff();
}
/**
* @param type $arg1
* @param type $arg2
*/
class Child extends Parent {
function doStuff($arg1, $arg2) {
...
}
}
Run Code Online (Sandbox Code Playgroud) 我想要一个辅助函数log,基本上执行以下操作:
log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
Run Code Online (Sandbox Code Playgroud)
我有时间部分,我有文件写入部分.然而,问题是方法签名本身log- 我应该放什么?这表示printf声明以...关键字结束,但我如何在我的函数中使用它?
void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Run Code Online (Sandbox Code Playgroud)
让我编辑这个包含更多信息.
我有一个const char * now ()返回"2014-02-03 16:33:00"形式的字符串.我想像这样传递另一个格式字符串.这两个陈述应该是等同的:
log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
Run Code Online (Sandbox Code Playgroud)
我知道这vfprintf可以让我通过va_list,但我怎么能把它now() …