چرا نمی شه در گارد کلاس فانکشن یک ماژول لود کرد ؟

با درود خدمت شما . می خواستم یک کدی رو بنویسم که فانکشنش دو حالت داشت یکی بالای ۵ مگ یکی هم پایین پنج مگ بخاطر همین نمی خواستم از موارد شرطی داخل فانکشن استفاده کنم

به همین منظور دوتا راه به نظرم اومد .

اولین راه اینکه کلا ماژول رو در خود قسمت گارد کلاس فانکشن بزارم به این صورت :

def upload_file(path, email) when %{size: size} = File.stat(path), size/1024 <= 5000 do
....
end

و دومی این بود که بیام یک بار درستش کنم و در یک فانکشنی و به صورت زیر بیارم :

def size_file(path) do
      %{size: size} = File.stat(path)
      size/1024
    end

  def upload_file(path, email) when size_file(path) 
end

اروری که می داد نیز به شرح زیر بود :

** (CompileError) lib/googlecli/googlequery.ex:25: cannot invoke local size_file/1 inside guard, called as: size_file(path)

البته لازم به ذکر هست من بجای اینکار از if استفاده کردم و مشکلمو حل کردم ولی برام سوال بود که چرا نباید این مورد برای من انجام می شد و ارور می داد

بر اساس پیشنهاد این پست :

با تشکر

ارور كه مشخصه ميگه متدى كه شما تعريف كردين نبايد توى گارد صدا زده بشه، ميتونيد از متدهاى كرنل استفاده كنيد يا از عبارت هاى predicate كه نتيجه بولين دارن استفاده كنيد،
https://keathley.io/2016/04/09/elixir-guard-clauses.html

اما مشكل با لود شدن ماژل چى بود؟ من همچين چيزى نديدم

درود خدمت شما تشکر از راهنماییتون . متوجه صحبت شما نشدم کجا نوشتم ماژول لود نشده ؟

در رابطه با دومین فانکشن درست کردم ببنید جواب ترو فالس می ده اینم قبول نکرد کد و ارور داد .

در تيتر مطلب شايدم من بد خوندم، بعدشم فرمودين ماژول رو در clause قرار بدم.
در مورد روش درست استفاده از guard clause هم در لينكى كه گذاشتم قوانين كاملا ساده و روشن مشخص شده، اگر مشكلى بود بپرسيد :slightly_smiling_face:
در مورد كد شما مشكل اينه كه متدى كه خودتون نوشتين و در clause فراخوانى كردين كه درست نيست

1 پسندیده

درود . تشکر از شما مطلب رو دارم می بینم کامل و جامع پاسخ داده خیلی لطف کردید

1 پسندیده

كار با گارد كلاز لذت بخشه اما نبايد زياده روى بشه

1 پسندیده