Câu lệnh điều khiển Raku để làm cho các chuỗi số được hiểu là số


8

Tôi có một hàm lớn các mảng,

%qual<discordant> (~ khoảng 13199 giá trị như '88 .23 ', '99 .23', v.v.

trong phạm vi từ 88-100 và được đọc từ các tệp văn bản,

và khi tôi in %qual<discordant>.min%qual<discordant>.maxtôi có thể thấy các giá trị rõ ràng là sai.

Tôi có thể khắc phục điều này bằng cách thay đổi cách đọc dữ liệu từ các tệp văn bản:

%qual{$type}.push: @line[5]

đến

%qual{$type}.push: @line[5].Num

nhưng điều này không trực quan, điều này khiến tôi mất vài phút để tìm hiểu tại sao Raku / Perl6 lại đưa ra câu trả lời rõ ràng không chính xác lúc đầu. Nó sẽ rất dễ dàng để bỏ lỡ lỗi này. Trong perl5, hành vi mặc định sẽ là coi các chuỗi này giống như các số.

Cần có một số tuyên bố kiểm soát để biến điều này thành hành vi mặc định, làm thế nào tôi có thể làm điều này?


1
Làm thế nào để @linecó được điền?
Elizabeth Mattijsen

@lineđược điền từ các tệp văn bản,my @line = $line.split(/\s+/)
con

my @line = $line.wordssau đó sẽ nhanh hơn
Elizabeth Mattijsen

Câu trả lời:


10

Vấn đề / tính năng thực sự là trong Raku khi bạn đọc các dòng từ một tệp, chúng trở thành các chuỗi (còn gọi là các đối tượng loại Str). Nếu bạn gọi .min.maxtrên một mảng các Strđối tượng, thì ngữ nghĩa chuỗi sẽ được sử dụng để xác định xem một cái gì đó lớn hơn hay nhỏ hơn.

những giá trị đặc biệt trong Raku hoạt động giống như các giá trị trong Perl. Trong Raku, chúng được gọi là " allomor ". Họ là Str, nhưng cũng Num, hoặc Rat, hoặc Int, hoặc Complex.

Cú pháp để tạo một dị thường thích hợp cho một chuỗi trong $_<< $_ >>. Vì vậy, nếu bạn thay đổi dòng đọc các từ thành:

my @line = $line.words.map: { << $_ >> }

sau đó các giá trị trong @linesẽ hoặc Str, IntStrhoặc RatStr. Mà nên làm .min.maxlàm việc như bạn mong đợi.

Tuy nhiên, nếu bạn chắc chắn rằng chỉ phần tử thứ 5 @linesẽ là số, thì có lẽ sẽ hiệu quả hơn khi chuyển đổi thành Strsố trước khi đẩy sang mảng. Một cú pháp ngắn hơn cho đó sẽ là tiền tố a +:

%qual{$type}.push: +@line[5]

Mặc dù bạn có thể thấy rằng quá ồn ào.

CẬP NHẬT: Tôi đã quên rằng thực sự có một phụ được gọi là valStrvà tạo ra một cấu trúc phù hợp của nó (hoặc trả về bản gốc Str). Vì vậy, mã để tạo @linecó thể được viết là:

my @line = $line.words>>.&val

1
Thường thì tôi thích sử dụng .Numericthay vì +một phần để tránh quá nhiều biểu tượng liên tiếp, nhưng cũng vì nó nhảy ra thêm một chút để nói "Này, tôi cần số này như một con số", +đủ nhỏ để nó có thể bị mất shuffle (ditto cho ~vs .Str).
user0721090601

Tôi nghĩ rằng hành vi mặc định trong Raku phải tương tự như Perl, tức là về cơ bản mọi thứ đều là dị hình, nó dễ dàng và trực quan hơn. Tôi nghĩ rằng mặc định nên được xem xét chuỗi như 83.44như số
con

Tạo các dị hình rất khó sử dụng trong Raku, vì nó đòi hỏi phải hoàn thành công việc để có thể tạo đúng kiểu dị hình. Điều này trái ngược với Perl, nơi công việc đó được thực hiện khi biến thực sự được sử dụng trong ngữ cảnh số vì Perl không có bất kỳ kiểu gõ rõ ràng nào. Vì vậy, không tạo ra mọi thứ như một allomor không chỉ là một quyết định thiết kế được suy nghĩ rất kỹ, mà còn có những lý do hiệu suất để không làm điều đó.
Elizabeth Mattijsen

fwiw tôi nghĩ raku nên làm những gì tôi có nghĩa là ... ... $ $ >> rất ồn ào ... vì vậy, bất kể tốc độ, xin vui lòng chúng tôi có thể có một phương pháp, hãy nói $ line.allo cho điều này? (vâng tôi biết tôi có thể viết một cái!)
p6steve

val($line)sẽ không làm điều đó cho bạn?
Elizabeth Mattijsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.