如问题中所述,如何实现PHP函数make_pipeline()?

时间:2019-01-01 22:26:38

标签: php

作为数据处理管道的一部分,完成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;
          };
     }
 }

2 个答案:

答案 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))
  }
}