__MODULE__ is the right answer here IMHO. It is consistent with the other 
"meta constants" like __ENV__, __DIR__ __FILE__ and so on in that they 
desugar to constants, but are file / code relative. It isn't a super common 
pattern, but last time I checked generated phoenix code does a 
%__MODULE__{} pattern match check on the changeset functions.

On Friday, January 21, 2022 at 6:56:42 AM UTC-5 ins...@gmail.com wrote:

> Thanks for the tip Wojtek
> Aliasing __MODULE__ should work in my case
>
> As far as I understand this pattern isn't used too often(at least projects 
> like Plug or Ecto don't use it), so I guess it is not really considered as 
> idiomatic 
>
> I just feel that if you are inside a module there should be a shortcut 
> built-in in the language(like when you call other functions from the module 
> you don't specify the full path) but it might be just old instincts from 
> other languages
>
> пʼятниця, 21 січня 2022 р. о 10:58:56 UTC Wojtek Mach пише:
>
>> Neither `%_{}` nor `%self{}` can be supported because they already have a 
>> meaning in pattern matches. The former means _any_ struct and the latter 
>> binds the matched struct name to the variable `self`.
>>
>> You can give `__MODULE__` another name with an alias:
>>
>>     alias __MODULE__, as: Struct
>>
>>     def connect(%Struct{} = channel)
>>
>>
>> On January 21, 2022, "gmail.com" <ins...@gmail.com> wrote:
>>
>> It is common to define a struct together with various functions that 
>> access that struct in the module:
>>
>>     defmodule Chat.Channel do
>>       defstruct name: "", public?: true
>>     
>>       def new do
>>         %Chat.Channel{name: "Untitled"}
>>       end
>>
>>       def connect(%Chat.Channel{} = channel) do
>>         IO.inspect(channel)
>>       end
>>     end
>>
>> It is also common to alias the struct for easier access
>>
>>     defmodule Chat.Channel do
>>       defstruct name: "", public?: true
>>     
>>       alias Chat.Channel
>>       
>>       # ...
>>     end
>>
>> But, say, renaming the module would require manually replacing all struct 
>> occurrences with the new module name. Aliasing can help, but if the last 
>> bit should be updated too(say Chat.Channel should be updated to Chat.Room) 
>> it would still require to manually replace everything.
>>
>> There is a workaround to use __MODULE__, but IMO the code looks a bit ugly
>>
>>     defmodule Chat.Channel do
>>       defstruct name: "", public?: true
>>     
>>       def new do
>>         %__MODEUL__{name: "Untitled"}
>>       end
>>     
>>       def connect(%__MODEUL__{} = channel) do
>>         IO.inspect(channel)
>>       end
>>     end
>>
>> I think It would be great to have some kind of shortcut(syntactic sugar) 
>> to access the struct within the module.
>> First I thought about something like %_(%%, %. etc) but this way it looks 
>> a bit cryptic 
>>
>>     def connect(%_{} = channel) do
>>
>> So maybe something like %self would work
>>
>>     defmodule Chat.Channel do
>>       defstruct name: "", public?: true
>>     
>>       def new do
>>         %self{name: "Untitled"}
>>       end
>>     
>>       def connect(%self{} = channel) do
>>         IO.inspect(channel)
>>       end
>>     end
>>
>> What do you think?
>>
>>  -- 
>>  You received this message because you are subscribed to the Google 
>> Groups "elixir-lang-core" group.
>>  To unsubscribe from this group and stop receiving emails from it, send 
>> an email to elixir-lang-co...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/da49bf41-d4ad-4fc7-a88c-1338e7a463c1n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/da49bf41-d4ad-4fc7-a88c-1338e7a463c1n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/b473f840-3e6e-43d5-b71b-280bb02b55f4n%40googlegroups.com.

Reply via email to