Tôi khá mới đối với ngôn ngữ lập trình Scala, và đang thử thứ gì đó mắc kẹt trong đầu khi đang theo dõi bài giảng tại here.Tìm hiểu về cách gọi và toán tử của phương thức infix (:) trong Scala
Tôi nghĩ rằng tôi có thể không thực sự hiểu thế nào nhược điểm điều hành hoạt động, đây là một số điều tôi đã cố gắng:
tôi đã tạo ra một bộ tạo số giả ngẫu nhiên, sau đó đã cố gắng để tạo ra một danh sách của một giá trị ngẫu nhiên:
scala> val gen = new java.util.Random
gen: java.util.Random = [email protected]
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Nhưng nó đã cố chuyển Danh sách (3) sang phương pháp tiếp theo. Khi tôi sử dụng paratheses, không có vấn đề
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
tôi rất tò mò về thứ tự thực hiện, do đó, tôi tạo ra một chức năng để kiểm tra xem nó
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Như đã thấy trong kết quả đầu ra, trình tự thực hiện cũng giống như thứ tự xuất hiện. Sau đó, tôi nghĩ rằng nó có thể là về chức năng 'nextInt', sau đó tôi đã thử theo dõi:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
Bổ sung được thực thi đầu tiên và sau khi thực hiện điều đó. Vì vậy, đây là câu hỏi: Sự khác biệt giữa gen nextInt 3 :: Nil
và 1 + 2 :: Nil
là gì?
Cảm ơn bạn đã trả lời chi tiết của bạn, nó đã cho tôi nhiều manh mối về nhiều thứ khác nữa. Nhưng tôi có thêm một câu hỏi: Trình biên dịch giải thích biểu thức trong phần mã thứ ba mà tôi đã đưa ra trong câu hỏi ban đầu của mình; về dấu ngoặc đơn? bởi vì việc sử dụng hàm pr cho thấy các thuật ngữ được thực hiện theo thứ tự từ trái sang phải. – ciuncan
Đúng vậy, các cuộc gọi hàm được đánh giá từ trái sang phải. Đó là bởi vì 'pr (X)' là các biểu thức đối số của '::' và chúng được đánh giá đầu tiên theo thứ tự xuất hiện và sau đó giá trị được truyền cho phương thức. 'pr (1) :: pr (2) :: pr (3) :: Nil' in 1 2 3. Nhưng' Nil.::(pr(3)).::(pr(2)). :: (pr (1)) 'in 3 2 1. Nhưng cả hai đều trả về' Danh sách (1, 2, 3) ' –
@ciuncan Tôi không biết. Nó có thể là ký hiệu toán tử với đúng fixity cho phép một thứ tự đánh giá không thể với dấu chấm, hoặc nó có thể là trình biên dịch tối ưu hóa '::' cuộc gọi nhưng có một lỗi liên quan đến đánh giá thứ tự. –