Scala,将最后两项列表的总和添加到同一列表中

时间:2015-09-23 21:31:34

标签: scala

我是scala的新手,我正在尝试对列表的元素运行操作,我想将结果添加到同一列表的末尾。

现在我有

func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum 

完成这项工作,但非常难看并且两次调用“func”。我宁愿有类似的东西:

func(pos - 1 , list).<somefunction>.takeright(2).sum

但我不确定该怎么做。

2 个答案:

答案 0 :(得分:1)

我不明白为什么你的工作代码应该是丑陋的,但是你可以通过将结果存储在局部变量中来消除冗余的方法调用。看起来您想要将最后两个项目的总和附加到列表中,因此您可能希望使用function kia_get_car_names_checkout_options(){ $args = array( 'author' => get_current_user_id(), 'posts_per_page' => -1, 'orderby' => 'post_title', 'order' => 'ASC', 'post_type' => 'car', 'post_status' => 'publish' ); $posts = get_posts( $args ); $car_names = wp_list_pluck( $posts, 'post_title', 'ID' ); return $car_names; } // Add a new checkout field function kia_filter_checkout_fields($fields){ $fields['extra_fields'] = array( 'another_field' => array( 'type' => 'select', 'options' => kia_get_car_names_checkout_options(), 'required' => true, 'label' => __( 'Another field' ) ) ); return $fields; } add_filter( 'woocommerce_checkout_fields', 'kia_filter_checkout_fields' ); // display the extra field on the checkout form function kia_extra_checkout_fields(){ $checkout = WC()->checkout(); ?> <div class="extra-fields"> <h3><?php _e( 'Additional Fields' ); ?></h3> <?php // because of this foreach, everything added to the array in the previous function will display automagically foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) : ?> <?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?> <?php endforeach; ?> </div> <?php } add_action( 'woocommerce_checkout_after_customer_details' ,'kia_extra_checkout_fields' ); 运算符而不是:+,但请记住,追加需要线性时间而前置到列表是不变的,所以你应该更喜欢后者。

所以你能做的就是

::

但是,为了向您展示Scala中可以完成的任务,这里有一个更接近您想要的输出的示例:

val intermediate: List[Int] = func(pos - 1, list)
intermediate :+ intermediate.takeRight(2).sum

通过定义隐式类,您可以模拟更丰富的接口,并将新方法def main(args: Array[String]) { println(func(4, Nil).append(_.takeRight(2).sum)) // List(1, 2, 3, 5) } def func(i: Int, l: List[Int]): List[Int] = List(1, 2, 3) implicit class PimpMyList(list: List[Int]) { def append(f: List[Int] => Int): List[Int] = { list :+ f(list) } } 添加到append的接口。请注意,现在,List只是list.append(x)的隐式语法。 new PimpMyList(list).append(x)采用将append转换为List[Int]的函数,因此我们可以根据需要使用函数Int调用它。

请注意,我们也可以将隐式类设为通用:

x => x.takeRight(2).sum

答案 1 :(得分:0)

您可以使用match将某些转换应用于某个表达式的结果:

List(1,2,3) match {
  case x => x :+ x.takeRight(2).sum
}

//>> List(1, 2, 3, 5)