ฉันได้เล่นกับ Ruby เมื่อเร็ว ๆ นี้และพบว่าตัวเองสงสัยว่าในภาษาเชิงวัตถุบริสุทธิ์ (และแม้กระทั่งผู้ที่ไม่บริสุทธิ์) วิธีการที่ใช้พารามิเตอร์เดียวเท่านั้น รูปแบบ? ถ้าไม่ทำไมล่ะ ฉันขอขอบคุณคำตอบที่ละเอียดและละเอียดมากแม้ในหัวข้อนี้
ฉันได้เล่นกับ Ruby เมื่อเร็ว ๆ นี้และพบว่าตัวเองสงสัยว่าในภาษาเชิงวัตถุบริสุทธิ์ (และแม้กระทั่งผู้ที่ไม่บริสุทธิ์) วิธีการที่ใช้พารามิเตอร์เดียวเท่านั้น รูปแบบ? ถ้าไม่ทำไมล่ะ ฉันขอขอบคุณคำตอบที่ละเอียดและละเอียดมากแม้ในหัวข้อนี้
คำตอบ:
วิธีการผูกมัดในภาษาเชิงวัตถุนั้นแตกต่างจากการแกงเล็กน้อย โดยนิยามผลของการ currying เป็นรูปแบบที่ จำกัด มากขึ้นจากเดิมที่ฟังก์ชั่น โดยการประชุมผลของวิธีการผูกมัดเป็นรูปแบบการแก้ไขของเดิม (ปกติไม่ใช่ฟังก์ชั่น) วัตถุ วิธีการผูกมัดสามารถใช้กับวิธีการที่ไม่เกี่ยวข้องในชั้นเรียนเดียวกันในขณะที่ currying เกี่ยวข้องกับการส่งกลับฟังก์ชั่นที่หนึ่งหรือมากกว่าหนึ่งพารามิเตอร์ของฟังก์ชั่นเดิมได้รับการแก้ไข (ที่กำหนดไว้ล่วงหน้า)
ใน Java วิธีการผูกมัดเป็นเช่น:
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
ดังนั้นการเรียกใช้เมธอด. append () แต่ละรายการจะส่งคืนตัวชี้ไปยังวัตถุ StringBuilder แบบไม่ระบุชื่อ วัตถุนี้เสร็จสมบูรณ์หลังจากแต่ละ. append () และไม่ใช่ฟังก์ชั่น
ในทางตรงกันข้ามใน Scala การประยุกต์ใช้หรือการแกงบางส่วนนั้นเป็นเช่น:
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
(ตัวอย่างที่นำมาจากบล็อกของ Daniel Yankowsky )
simpler()
simple()
ในตัวอย่างนี้เป็นเสื้อคลุมฟังก์ชั่นสำหรับ simpler()
ยังคงเป็นฟังก์ชั่นที่ใช้พารามิเตอร์มากขึ้นก่อนที่จะสามารถประเมินเป็นอะไรก็ได้ยกเว้นรุ่นที่ จำกัด ของตัวเอง
แก้ไข: การอ่านวันนี้ในภายหลังฉันคิดว่า "ฟังก์ชั่น wrapper" เป็นกุญแจสำคัญ แอพพลิเคชั่นการ currying หรือบางส่วนอาจจำลองได้ดีที่สุดใน Java ด้วยวิธีการหุ้ม
public interface Simpler {
public int apply(int y, int z);
}
public class Simple {
public int apply(int x, int y, int z) { return x * (y + z); }
public Simpler partiallyApply(final int x) {
final simple = this;
return new Simpler() {
@Override
public int apply(int y, int z) {
// x is the final int parameter to partiallyApply()
simple.apply(x, y, z);
}
}
}
}
: END-แก้ไข
วิธีการผูกมัดอาจคล้ายกับแอปพลิเคชั่นบางส่วนหรือการแกง แต่สามารถเทียบเท่าได้กับวิธีการที่ส่งกลับวิธีการอื่น ๆ (ค้นหา Functors) แล้ววิธีการจะต้องตั้งค่าด้วยประเภทการส่งคืนที่มีความหมายแบบจำลอง
วิธีการผูกมัดยิ่งใช้บ่อยในการดำเนินการบางอย่างเช่นการประเมินผลขี้เกียจเป็นจะทำกับ "สร้าง" รูปแบบการออกแบบใหม่และคอลเลกชันอินเตอร์เฟซในห้องสมุด Java 8
ฉันหวังว่าจะช่วย
toString()
โทรเราจะไม่เลียนแบบความตั้งใจในการ curating ในการโทรของเราหรือไม่ ฉันแค่พยายามที่จะรับแนวคิดของการ currying ใน OO ตรง
append(charSeq)
ฟังก์ชั่นเป็นรูปแบบ curried ของinsert(destOffset, charSeq)
ฟังก์ชั่นที่destOffset
มักจะมีความยาวของ StringBuilder