作为数据处理管道的一部分,完成make_pipeline
方法的实现:
该方法应接受可变数量的函数,并且应返回一个接受一个参数$arg
的新函数。返回的函数应使用参数make_pipeline
调用$arg
中的第一个函数,并使用第一个函数的结果来调用第二个函数。
返回的函数应继续按照相同的模式依次调用make_pipeline
中的每个函数,并从最后一个函数返回值。例如:
$fun = Pipeline::make_pipeline(
function($x) {
return $x * 3;
},
function($x) {
return $x + 1;
},
function($x) {
return $x / 2;
}
);
# should print 5
echo $fun(3);
class Pipeline
{
public static function make_pipeline(...$funcs)
{
return function($arg) use ($funcs)
{
return NULL;
};
}
}
答案 0 :(得分:0)
通常,在没有OP尽力解决的情况下,无论是面试问题还是家庭作业,我都不会帮忙,但是看起来您已经找到了难题的一部分,所以我会看看是否可以帮忙与其余的。如果您长时间思考这个问题并分解说明,可以将其拆开以找出解决方法:
该方法应接受可变数量的功能
这里func_get_args()
之类的东西就足够了–编辑:正如Paul Crovella所指出的那样,尽管我倾向于使用file_get_args()
,但是您可以使用已经拥有的(splat operator)< / em>
应返回一个接受一个参数
$arg
的新函数
因此您需要返回一个匿名函数,该函数接受第一个参数以启动进程
返回的函数应继续按顺序调用make_pipeline中的每个函数
这将暗示某种循环
并从最后一个函数返回值
这建议您需要存储一个值,该值始终会覆盖自身,但也将自身用作下一个函数的arg
这会使您处于类似状态:
class Pipeline
{
public static function make_pipeline()
{
# The method should accept a variable number of functions
$args = func_get_args();
# should return a new function that accepts one parameter
# you need to access the functions injected from the method so "use" is required
$function = function($arg) use ($args)
{
# ...continue calling each function in the make_pipeline in order
foreach($args as $function) {
# You first need to store the triggering value in first function of args
if(!isset($value))
$value = $function($arg);
# Subsequent executions will now use the stored value and reset it simultaneously
else
$value = $function($value);
}
# Send back this value
return $value;
};
# Return our anonymous function
return $function;
}
}
您可以自己测试一下,看看它是否有效,但是您可能想尝试剖析给出的问题,以找到有关操作的提示。
答案 1 :(得分:0)
如果对落入此处的任何Scala开发人员有所帮助,我在Scala中尝试了上述解决方案。可以使用foldLeft函数来实现:
object Pipeline {
def compute[T](input: T, fn: T => T) = {
fn(input)
}
def makePipeline[T](functions: (T => T)*)= (x: T) => {
functions.foldLeft(x)((x, fn) => compute(x, fn))
}
def main(args: Array[String]) = {
println(makePipeline((x: Int) => x * 3, (x: Int) => x + 1, (x: Int) => x / 2)(3))
}
}