Less.js: Bagaimana menangani matematika unit campuran

Dibuat pada 9 Apr 2017  ·  6Komentar  ·  Sumber: less/less.js

div {
    <strong i="5">@value</strong>: 1px;
    a: <strong i="6">@value</strong> * 1rem;       // 1px  - ok
    b: <strong i="7">@value</strong> * 1px * 1rem; // 1px  - ok
    d: <strong i="8">@value</strong> / 1px;        // 1px  - ok
    c: <strong i="9">@value</strong> / 1px * 1rem; // 1rem - unexpected
    e: <strong i="10">@value</strong> / 1px + 0rem; // 1rem - unexpected
}

c dan d hasil di atas bertentangan dengan http://lesscss.org/features/#features -overview-feature-operations yang menyatakan bahwa hasil harus memiliki unit ekspresi paling kiri (yaitu semua ekspresi di atas harus menghasilkan 1px ). Pengujian hanya mencakup ekspresi a / b / c yang secara tidak sengaja menghasilkan hasil yang diharapkan.
Terkait dengan #2418 dan #2472.

bug needs decision

Komentar yang paling membantu

Sejujurnya, saya tidak pernah menjadi penggemar bisa mencampur unit di Less. Tidak masuk akal dari perspektif matematika, dan seperti yang Anda tunjukkan, itu semua berdasarkan urutan evaluasi.... yang juga tidak masuk akal.

Namun, ketika saya melihat kode strictUnits , itu juga tidak masuk akal bagi saya. Itu juga sepertinya tidak melakukan apa yang saya pikir akan dilakukan.

Jadi, ya, itu aneh, tapi saya tidak ingin melihatnya tetap. Saya lebih cenderung melihat matematika unit campuran hilang. Tapi itu hanya aku. Seperti hasil 1px * 1px seharusnya 1px^2 (tidak berguna, tapi benar). Dan hasil dari 1px / 1px seharusnya 1 . Sass terlalu rumit tentang beberapa jenis matematika, tetapi menggunakan prinsip matematika dasar untuk melakukan hal-hal seperti beralih unit unit campuran. Sebagai contoh.

<strong i="13">@value</strong> / 1px * 1rem
Matematika di sini adalah 10px / 1px . Ini akan menghasilkan 1 (bukan di Less, hanya pada prinsipnya, dan akan di Sass). 1 * 1rem = 1rem . Jangan tersinggung Alexis dalam asal-usul fitur ini, tetapi memilih unit pertama dari sebuah ekspresi agak aneh, sulit untuk dievaluasi, dan dapat menyebabkan kasus-kasus tepi kereta ini.

Hanya $0,02 saya.

Semua 6 komentar

Sejujurnya, saya tidak pernah menjadi penggemar bisa mencampur unit di Less. Tidak masuk akal dari perspektif matematika, dan seperti yang Anda tunjukkan, itu semua berdasarkan urutan evaluasi.... yang juga tidak masuk akal.

Namun, ketika saya melihat kode strictUnits , itu juga tidak masuk akal bagi saya. Itu juga sepertinya tidak melakukan apa yang saya pikir akan dilakukan.

Jadi, ya, itu aneh, tapi saya tidak ingin melihatnya tetap. Saya lebih cenderung melihat matematika unit campuran hilang. Tapi itu hanya aku. Seperti hasil 1px * 1px seharusnya 1px^2 (tidak berguna, tapi benar). Dan hasil dari 1px / 1px seharusnya 1 . Sass terlalu rumit tentang beberapa jenis matematika, tetapi menggunakan prinsip matematika dasar untuk melakukan hal-hal seperti beralih unit unit campuran. Sebagai contoh.

<strong i="13">@value</strong> / 1px * 1rem
Matematika di sini adalah 10px / 1px . Ini akan menghasilkan 1 (bukan di Less, hanya pada prinsipnya, dan akan di Sass). 1 * 1rem = 1rem . Jangan tersinggung Alexis dalam asal-usul fitur ini, tetapi memilih unit pertama dari sebuah ekspresi agak aneh, sulit untuk dievaluasi, dan dapat menyebabkan kasus-kasus tepi kereta ini.

Hanya $0,02 saya.

Saya pikir yang seharusnya terjadi adalah, seperti perubahan pada matematika, ada perubahan dalam unit campuran sehingga ada opsi ketiga di antara keduanya:

  1. strictUnits: false - mencoba mengerjakan matematika dan memaksa unit
  2. strictUnits: ? - misalnya 1px / 1px // output 1 , 100vh - 10px // output 100vh - 10px yaitu dengan unit campuran, biarkan ekspresi apa adanya dan output - berguna untuk sub-ekspresi yang ditetapkan ke vars dan digunakan dalam calc() - default masa depan?
  3. strictUnits: true - melempar kesalahan (Saya tidak melihat bagaimana ini berguna.)

Masalahnya bukan tentang pendapat pribadi tentang penanganan unit/aritma. Ini tentang kompiler yang tidak mengikuti dokumentasinya sendiri. (Untuk sisanya lihat misalnya https://github.com/less/less.js/issues/1366#issuecomment-342361948).

Masalahnya bukan tentang pendapat pribadi tentang penanganan unit/aritma. Ini tentang kompiler yang tidak mengikuti dokumentasinya sendiri

Ya, saya mengerti. Tapi pada akhirnya ini tentang bagaimana "memperbaikinya", bukan? Jadi saya hanya mengatakan secara tidak langsung bahwa saya pikir ini tidak layak untuk diperbaiki, dan sebaliknya itu harus memiliki perilaku yang lebih intuitif. Tapi ya, itu hanya, seperti, pendapat saya, kawan.

@seven-phases-max Sekadar catatan: Saya telah menulis ulang sebagian besar metode operasi untuk unit, dan mereka memang memiliki beberapa akrobat aneh untuk menentukan unit akhir. Saya membuatnya jauh lebih mudah di mana unit sisi kiri menang ketika unit paksa adalah opsi yang diteruskan.

(Ada beberapa utas di mana pendapat berbeda tentang kemungkinan peningkatan unit yang ketat tetapi karena itu tersebar di seluruh pelacak (atau setidaknya saya tidak dapat menemukan utas khusus dengan cepat) saya kira saya hanya membunyikan bagian kunci dari :)
Pendapat pribadi saya tentang

ketatUnit: ? - misalnya 1px / 1px // keluaran 1, 100vh - 10px // keluaran 100vh - 10px

adalah sesuatu seperti: tidak akan sepadan (karena rasio hasil/usaha). Dengan kata lain, sebenarnya tidak ada yang perlu ditingkatkan (kecuali hanya memperbaiki bug yang jelas seperti di atas).

Perhatikan bahwa untuk membuatnya benar-benar generik (berlawanan dengan harcoding ini dan nilai/pola operasi/contoh minimalis) Anda harus menangani semua persamaan aritmatika biasa dengan benar dan dengan demikian memperkenalkan unit "imajiner" seperti px² dan serupa. Misalnya untuk a: 1px; b: 2px; c: 4px; hasil yang diharapkan dari a*b/c (jelas menerima (a*b)/c = a*(b/c) ) akan menjadi .5px berarti bahwa hasil dari a*b harus 2px² (setidaknya secara internal).

Ada masalah implementasi lainnya (jelas akan terlihat aneh untuk juga menghitung hal-hal seperti 1/1hz = 1s dll. tetapi secara formal ...) Menghitung dalam sen: Saya akan mengatakan CSS Units terlalu besar untuk menyodoknya tanpa alasan (" hanya karena sesuatu seperti 1px/1px = 1 terlihat intuitif").

strictUnits: true - lempar kesalahan (saya tidak melihat bagaimana ini berguna.)

Pada dasarnya jika seseorang tidak menyukai propagasi unit dan/atau unit campuran, ia dapat memperkenalkan gaya pengkodean yang lebih ketat yang tidak mengizinkan aritmatika seperti itu (jadi strictUnits: true ini pada dasarnya merupakan opsi untuk memaksa gaya pengkodean ini).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat